diff --git a/CMakeLists.txt b/CMakeLists.txt
index c73b5f2..fc6b846 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -391,16 +391,15 @@
 # GFlags.
 if (GFLAGS)
   # Don't search with REQUIRED as we can continue without gflags.
-  find_package(Gflags)
-  if (GFLAGS_FOUND)
-    message("-- Found Google Flags header in: ${GFLAGS_INCLUDE_DIRS}, "
-      "in namespace: ${GFLAGS_NAMESPACE}")
-    add_definitions(-DCERES_GFLAGS_NAMESPACE=${GFLAGS_NAMESPACE})
-  else (GFLAGS_FOUND)
+  find_package(gflags 2.2.0 CONFIG
+    HINTS "${HOMEBREW_INCLUDE_DIR_HINTS}")
+  if (gflags_FOUND)
+    message("-- Found Google Flags version ${gflags_VERSION}: ${GFLAGS_INCLUDE_DIR}")
+  else (gflags_FOUND)
     message("-- Did not find Google Flags (gflags), Building without gflags "
       "- no tests or tools will be built!")
     update_cache_variable(GFLAGS OFF)
-  endif (GFLAGS_FOUND)
+  endif (gflags_FOUND)
 else (GFLAGS)
   message("-- Google Flags disabled; no tests or tools will be built!")
   # Mark as advanced (remove from default GUI view) the gflags search
@@ -442,13 +441,13 @@
   set(GLOG_GFLAGS_DEPENDENCY_MESSAGE
     " Assuming glog was built with gflags support as gflags was found. "
     "This will make gflags a public dependency of Ceres.")
-  if (NOT GFLAGS_FOUND)
+  if (NOT gflags_FOUND)
     set(GLOG_GFLAGS_DEPENDENCY_MESSAGE
       " Assuming glog was NOT built with gflags support as gflags was "
       "not found.  If glog was built with gflags, please set the "
       "gflags search locations such that it can be found by Ceres.  "
       "Otherwise, Ceres may fail to link due to missing gflags symbols.")
-  endif(NOT GFLAGS_FOUND)
+  endif(NOT gflags_FOUND)
   message("-- Found Google Log (glog)." ${GLOG_GFLAGS_DEPENDENCY_MESSAGE})
 endif (MINIGLOG)
 
@@ -761,7 +760,6 @@
         DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR})
 install(FILES "${Ceres_BINARY_DIR}/CeresConfigVersion.cmake"
               "${Ceres_SOURCE_DIR}/cmake/FindGlog.cmake"
-              "${Ceres_SOURCE_DIR}/cmake/FindGflags.cmake"
         DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR})
 
 # Create an uninstall target to remove all installed files.
diff --git a/bazel/ceres.bzl b/bazel/ceres.bzl
index cbd2c51..e58f32e 100644
--- a/bazel/ceres.bzl
+++ b/bazel/ceres.bzl
@@ -137,8 +137,7 @@
 # like SuiteSparse or not, threading or not, glog or not, and so on.
 # See https://github.com/ceres-solver/ceres-solver/issues/335.
 def ceres_library(name,
-                  restrict_schur_specializations=False,
-                  gflags_namespace="gflags"):
+                  restrict_schur_specializations=False):
     # The path to internal/ depends on whether Ceres is the main workspace or
     # an external repository.
     if native.repository_name() != '@':
@@ -198,7 +197,6 @@
             "CERES_NO_LAPACK",
             "CERES_USE_EIGEN_SPARSE",
             "CERES_USE_CXX11_THREADS",
-            "CERES_GFLAGS_NAMESPACE=" + gflags_namespace,
         ],
         includes = [
             "config",
diff --git a/cmake/CeresConfig.cmake.in b/cmake/CeresConfig.cmake.in
index 37f8d52..1c22db2 100644
--- a/cmake/CeresConfig.cmake.in
+++ b/cmake/CeresConfig.cmake.in
@@ -197,6 +197,7 @@
 # Flag set during configuration and build of Ceres.
 set(CERES_USES_MINIGLOG @MINIGLOG@)
 set(CERES_USES_GFLAGS @GFLAGS@)
+set(CERES_GFLAGS_VERSION @gflags_VERSION@)
 if (CERES_USES_MINIGLOG)
   # Output message at standard log level (not the lower STATUS) so that
   # the message is output in GUI during configuration to warn user.
@@ -233,23 +234,13 @@
   # gflags is only a public dependency of Ceres via glog, thus is not required
   # if Ceres was built with MINIGLOG.
   if (CERES_USES_GFLAGS)
-    set(GFLAGS_WAS_BUILT_WITH_CMAKE @FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION@)
-    if (GFLAGS_WAS_BUILT_WITH_CMAKE)
-      set(gflags_DIR "@gflags_DIR@")
-      set(GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION TRUE)
-    else()
-      list(APPEND GFLAGS_INCLUDE_DIR_HINTS "@GFLAGS_INCLUDE_DIR@")
-      get_filename_component(CERES_BUILD_GFLAGS_LIBRARY_DIR "@GFLAGS_LIBRARY@" PATH)
-      list(APPEND GFLAGS_LIBRARY_DIR_HINTS ${CERES_BUILD_GFLAGS_LIBRARY_DIR})
-    endif()
     # Search quietly s/t we control the timing of the error message if not found.
-    find_package(Gflags QUIET)
-    if (GFLAGS_FOUND)
+    find_dependency(gflags ${CERES_GFLAGS_VERSION} CONFIG QUIET)
+    if (gflags_FOUND)
       message(STATUS "Found required Ceres dependency: gflags")
     else()
       ceres_report_not_found("Missing required Ceres "
-        "dependency: gflags. Searched using GFLAGS_INCLUDE_DIR_HINTS: "
-        "${GFLAGS_INCLUDE_DIR_HINTS} and gflags_DIR: ${gflags_DIR}.")
+        "dependency: gflags.")
     endif()
   endif()
 endif(CERES_USES_MINIGLOG)
diff --git a/cmake/FindGflags.cmake b/cmake/FindGflags.cmake
deleted file mode 100644
index c8151a5..0000000
--- a/cmake/FindGflags.cmake
+++ /dev/null
@@ -1,613 +0,0 @@
-# Ceres Solver - A fast non-linear least squares minimizer
-# Copyright 2015 Google Inc. All rights reserved.
-# http://ceres-solver.org/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.
-# * Neither the name of Google Inc. nor the names of its contributors may be
-#   used to endorse or promote products derived from this software without
-#   specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Author: alexs.mac@gmail.com (Alex Stewart)
-#
-
-# FindGflags.cmake - Find Google gflags logging library.
-#
-# This module will attempt to find gflags, either via an exported CMake
-# configuration (generated by gflags >= 2.1 which are built with CMake), or
-# by performing a standard search for all gflags components.  The order of
-# precedence for these two methods of finding gflags is controlled by:
-# GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION.
-#
-# This module defines the following variables:
-#
-# GFLAGS_FOUND: TRUE iff gflags is found.
-# GFLAGS_INCLUDE_DIRS: Include directories for gflags.
-# GFLAGS_LIBRARIES: Libraries required to link gflags.
-# GFLAGS_NAMESPACE: The namespace in which gflags is defined.  In versions of
-#                   gflags < 2.1, this was google, for versions >= 2.1 it is
-#                   by default gflags, although can be configured when building
-#                   gflags to be something else (i.e. google for legacy
-#                   compatibility).
-# FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION: True iff the version of gflags
-#                                             found was built & installed /
-#                                             exported as a CMake package.
-#
-# The following variables control the behaviour of this module when an exported
-# gflags CMake configuration is not found.
-#
-# GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION: TRUE/FALSE, iff TRUE then
-#                           then prefer using an exported CMake configuration
-#                           generated by gflags >= 2.1 over searching for the
-#                           gflags components manually.  Otherwise (FALSE)
-#                           ignore any exported gflags CMake configurations and
-#                           always perform a manual search for the components.
-#                           Default: TRUE iff user does not define this variable
-#                           before we are called, and does NOT specify either
-#                           GFLAGS_INCLUDE_DIR_HINTS or GFLAGS_LIBRARY_DIR_HINTS
-#                           otherwise FALSE.
-# GFLAGS_INCLUDE_DIR_HINTS: List of additional directories in which to
-#                           search for gflags includes, e.g: /timbuktu/include.
-# GFLAGS_LIBRARY_DIR_HINTS: List of additional directories in which to
-#                           search for gflags libraries, e.g: /timbuktu/lib.
-#
-# The following variables are also defined by this module, but in line with
-# CMake recommended FindPackage() module style should NOT be referenced directly
-# by callers (use the plural variables detailed above instead).  These variables
-# do however affect the behaviour of the module via FIND_[PATH/LIBRARY]() which
-# are NOT re-called (i.e. search for library is not repeated) if these variables
-# are set with valid values _in the CMake cache_. This means that if these
-# variables are set directly in the cache, either by the user in the CMake GUI,
-# or by the user passing -DVAR=VALUE directives to CMake when called (which
-# explicitly defines a cache variable), then they will be used verbatim,
-# bypassing the HINTS variables and other hard-coded search locations.
-#
-# GFLAGS_INCLUDE_DIR: Include directory for gflags, not including the
-#                     include directory of any dependencies.
-# GFLAGS_LIBRARY: gflags library, not including the libraries of any
-#                 dependencies.
-
-# Reset CALLERS_CMAKE_FIND_LIBRARY_PREFIXES to its value when FindGflags was
-# invoked, necessary for MSVC.
-macro(GFLAGS_RESET_FIND_LIBRARY_PREFIX)
-  if (MSVC AND CALLERS_CMAKE_FIND_LIBRARY_PREFIXES)
-    set(CMAKE_FIND_LIBRARY_PREFIXES "${CALLERS_CMAKE_FIND_LIBRARY_PREFIXES}")
-  endif()
-endmacro(GFLAGS_RESET_FIND_LIBRARY_PREFIX)
-
-# Called if we failed to find gflags or any of it's required dependencies,
-# unsets all public (designed to be used externally) variables and reports
-# error message at priority depending upon [REQUIRED/QUIET/<NONE>] argument.
-macro(GFLAGS_REPORT_NOT_FOUND REASON_MSG)
-  unset(GFLAGS_FOUND)
-  unset(GFLAGS_INCLUDE_DIRS)
-  unset(GFLAGS_LIBRARIES)
-  # Do not use unset, as we want to keep GFLAGS_NAMESPACE in the cache,
-  # but simply clear its value.
-  set(GFLAGS_NAMESPACE "" CACHE STRING
-    "gflags namespace (google or gflags)" FORCE)
-
-  # Make results of search visible in the CMake GUI if gflags has not
-  # been found so that user does not have to toggle to advanced view.
-  mark_as_advanced(CLEAR GFLAGS_INCLUDE_DIR
-                         GFLAGS_LIBRARY
-                         GFLAGS_NAMESPACE)
-
-  gflags_reset_find_library_prefix()
-
-  # Note <package>_FIND_[REQUIRED/QUIETLY] variables defined by FindPackage()
-  # use the camelcase library name, not uppercase.
-  if (Gflags_FIND_QUIETLY)
-    message(STATUS "Failed to find gflags - " ${REASON_MSG} ${ARGN})
-  elseif (Gflags_FIND_REQUIRED)
-    message(FATAL_ERROR "Failed to find gflags - " ${REASON_MSG} ${ARGN})
-  else()
-    # Neither QUIETLY nor REQUIRED, use no priority which emits a message
-    # but continues configuration and allows generation.
-    message("-- Failed to find gflags - " ${REASON_MSG} ${ARGN})
-  endif ()
-  return()
-endmacro(GFLAGS_REPORT_NOT_FOUND)
-
-# Verify that all variable names passed as arguments are defined (can be empty
-# but must be defined) or raise a fatal error.
-macro(GFLAGS_CHECK_VARS_DEFINED)
-  foreach(CHECK_VAR ${ARGN})
-    if (NOT DEFINED ${CHECK_VAR})
-      message(FATAL_ERROR "Ceres Bug: ${CHECK_VAR} is not defined.")
-    endif()
-  endforeach()
-endmacro(GFLAGS_CHECK_VARS_DEFINED)
-
-# Use check_cxx_source_compiles() to compile trivial test programs to determine
-# the gflags namespace.  This works on all OSs except Windows.  If using Visual
-# Studio, it fails because msbuild forces check_cxx_source_compiles() to use
-# CMAKE_BUILD_TYPE=Debug for the test project, which usually breaks detection
-# because MSVC requires that the test project use the same build type as gflags,
-# which would normally be built in Release.
-#
-# Defines: GFLAGS_NAMESPACE in the caller's scope with the detected namespace,
-#          which is blank (empty string, will test FALSE is CMake conditionals)
-#          if detection failed.
-function(GFLAGS_CHECK_GFLAGS_NAMESPACE_USING_TRY_COMPILE)
-  # Verify that all required variables are defined.
-  gflags_check_vars_defined(
-    GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY)
-  # Ensure that GFLAGS_NAMESPACE is always unset on completion unless
-  # we explicitly set if after having the correct namespace.
-  set(GFLAGS_NAMESPACE "" PARENT_SCOPE)
-
-  include(CheckCXXSourceCompiles)
-  # Setup include path & link library for gflags for CHECK_CXX_SOURCE_COMPILES.
-  set(CMAKE_REQUIRED_INCLUDES ${GFLAGS_INCLUDE_DIR})
-  set(CMAKE_REQUIRED_LIBRARIES ${GFLAGS_LIBRARY} ${GFLAGS_LINK_LIBRARIES})
-  # First try the (older) google namespace.  Note that the output variable
-  # MUST be unique to the build type as otherwise the test is not repeated as
-  # it is assumed to have already been performed.
-  check_cxx_source_compiles(
-    "#include <gflags/gflags.h>
-     int main(int argc, char * argv[]) {
-       google::ParseCommandLineFlags(&argc, &argv, true);
-       return 0;
-     }"
-     GFLAGS_IN_GOOGLE_NAMESPACE)
-  if (GFLAGS_IN_GOOGLE_NAMESPACE)
-    set(GFLAGS_NAMESPACE google PARENT_SCOPE)
-    return()
-  endif()
-
-  # Try (newer) gflags namespace instead.  Note that the output variable
-  # MUST be unique to the build type as otherwise the test is not repeated as
-  # it is assumed to have already been performed.
-  set(CMAKE_REQUIRED_INCLUDES ${GFLAGS_INCLUDE_DIR})
-  set(CMAKE_REQUIRED_LIBRARIES ${GFLAGS_LIBRARY} ${GFLAGS_LINK_LIBRARIES})
-  check_cxx_source_compiles(
-    "#include <gflags/gflags.h>
-     int main(int argc, char * argv[]) {
-        gflags::ParseCommandLineFlags(&argc, &argv, true);
-        return 0;
-     }"
-     GFLAGS_IN_GFLAGS_NAMESPACE)
-  if (GFLAGS_IN_GFLAGS_NAMESPACE)
-    set(GFLAGS_NAMESPACE gflags PARENT_SCOPE)
-    return()
-  endif (GFLAGS_IN_GFLAGS_NAMESPACE)
-endfunction(GFLAGS_CHECK_GFLAGS_NAMESPACE_USING_TRY_COMPILE)
-
-# Use regex on the gflags headers to attempt to determine the gflags namespace.
-# Checks both gflags.h (contained namespace on versions < 2.1.2) and
-# gflags_declare.h, which contains the namespace on versions >= 2.1.2.
-# In general, this method should only be used when
-# GFLAGS_CHECK_GFLAGS_NAMESPACE_USING_TRY_COMPILE() cannot be used, or has
-# failed.
-#
-# Defines: GFLAGS_NAMESPACE in the caller's scope with the detected namespace,
-#          which is blank (empty string, will test FALSE is CMake conditionals)
-#          if detection failed.
-function(GFLAGS_CHECK_GFLAGS_NAMESPACE_USING_REGEX)
-  # Verify that all required variables are defined.
-  gflags_check_vars_defined(GFLAGS_INCLUDE_DIR)
-  # Ensure that GFLAGS_NAMESPACE is always undefined on completion unless
-  # we explicitly set if after having the correct namespace.
-  set(GFLAGS_NAMESPACE "" PARENT_SCOPE)
-
-  # Scan gflags.h to identify what namespace gflags was built with.  On
-  # versions of gflags < 2.1.2, gflags.h was configured with the namespace
-  # directly, on >= 2.1.2, gflags.h uses the GFLAGS_NAMESPACE #define which
-  # is defined in gflags_declare.h, we try each location in turn.
-  set(GFLAGS_HEADER_FILE ${GFLAGS_INCLUDE_DIR}/gflags/gflags.h)
-  if (NOT EXISTS ${GFLAGS_HEADER_FILE})
-    gflags_report_not_found(
-      "Could not find file: ${GFLAGS_HEADER_FILE} "
-      "containing namespace information in gflags install located at: "
-      "${GFLAGS_INCLUDE_DIR}.")
-  endif()
-  file(READ ${GFLAGS_HEADER_FILE} GFLAGS_HEADER_FILE_CONTENTS)
-
-  string(REGEX MATCH "namespace [A-Za-z]+"
-    GFLAGS_NAMESPACE "${GFLAGS_HEADER_FILE_CONTENTS}")
-  string(REGEX REPLACE "namespace ([A-Za-z]+)" "\\1"
-    GFLAGS_NAMESPACE "${GFLAGS_NAMESPACE}")
-
-  if (NOT GFLAGS_NAMESPACE)
-    gflags_report_not_found(
-      "Failed to extract gflags namespace from header file: "
-      "${GFLAGS_HEADER_FILE}.")
-  endif (NOT GFLAGS_NAMESPACE)
-
-  if (GFLAGS_NAMESPACE STREQUAL "google" OR
-      GFLAGS_NAMESPACE STREQUAL "gflags")
-    # Found valid gflags namespace from gflags.h.
-    set(GFLAGS_NAMESPACE "${GFLAGS_NAMESPACE}" PARENT_SCOPE)
-    return()
-  endif()
-
-  # Failed to find gflags namespace from gflags.h, gflags is likely a new
-  # version, check gflags_declare.h, which in newer versions (>= 2.1.2) contains
-  # the GFLAGS_NAMESPACE #define, which is then referenced in gflags.h.
-  set(GFLAGS_DECLARE_FILE ${GFLAGS_INCLUDE_DIR}/gflags/gflags_declare.h)
-  if (NOT EXISTS ${GFLAGS_DECLARE_FILE})
-    gflags_report_not_found(
-      "Could not find file: ${GFLAGS_DECLARE_FILE} "
-      "containing namespace information in gflags install located at: "
-      "${GFLAGS_INCLUDE_DIR}.")
-  endif()
-  file(READ ${GFLAGS_DECLARE_FILE} GFLAGS_DECLARE_FILE_CONTENTS)
-
-  string(REGEX MATCH "#define GFLAGS_NAMESPACE [A-Za-z]+"
-    GFLAGS_NAMESPACE "${GFLAGS_DECLARE_FILE_CONTENTS}")
-  string(REGEX REPLACE "#define GFLAGS_NAMESPACE ([A-Za-z]+)" "\\1"
-    GFLAGS_NAMESPACE "${GFLAGS_NAMESPACE}")
-
-  if (NOT GFLAGS_NAMESPACE)
-    gflags_report_not_found(
-      "Failed to extract gflags namespace from declare file: "
-      "${GFLAGS_DECLARE_FILE}.")
-  endif (NOT GFLAGS_NAMESPACE)
-
-  if (GFLAGS_NAMESPACE STREQUAL "google" OR
-      GFLAGS_NAMESPACE STREQUAL "gflags")
-    # Found valid gflags namespace from gflags.h.
-    set(GFLAGS_NAMESPACE "${GFLAGS_NAMESPACE}" PARENT_SCOPE)
-    return()
-  endif()
-endfunction(GFLAGS_CHECK_GFLAGS_NAMESPACE_USING_REGEX)
-
-# Protect against any alternative find_package scripts for this library having
-# been called previously (in a client project) which set GFLAGS_FOUND, but not
-# the other variables we require / set here which could cause the search logic
-# here to fail.
-unset(GFLAGS_FOUND)
-
-# -----------------------------------------------------------------
-# By default, if the user has expressed no preference for using an exported
-# gflags CMake configuration over performing a search for the installed
-# components, and has not specified any hints for the search locations, then
-# prefer a gflags exported configuration if available.
-if (NOT DEFINED GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION
-    AND NOT GFLAGS_INCLUDE_DIR_HINTS
-    AND NOT GFLAGS_LIBRARY_DIR_HINTS)
-  message(STATUS "No preference for use of exported gflags CMake configuration "
-    "set, and no hints for include/library directories provided. "
-    "Defaulting to preferring an installed/exported gflags CMake configuration "
-    "if available.")
-  set(GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION TRUE)
-endif()
-
-# On macOS, add the Homebrew prefix (with appropriate suffixes) to the
-# respective HINTS directories (after any user-specified locations).  This
-# handles Homebrew installations into non-standard locations (not /usr/local).
-# We do not use CMAKE_PREFIX_PATH for this as given the search ordering of
-# find_xxx(), doing so would override any user-specified HINTS locations with
-# the Homebrew version if it exists.
-if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
-  find_program(HOMEBREW_EXECUTABLE brew)
-  mark_as_advanced(FORCE HOMEBREW_EXECUTABLE)
-  if (HOMEBREW_EXECUTABLE)
-    # Detected a Homebrew install, query for its install prefix.
-    execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix
-      OUTPUT_VARIABLE HOMEBREW_INSTALL_PREFIX
-      OUTPUT_STRIP_TRAILING_WHITESPACE)
-    message(STATUS "Detected Homebrew with install prefix: "
-      "${HOMEBREW_INSTALL_PREFIX}, adding to CMake search paths.")
-    list(APPEND GFLAGS_INCLUDE_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/include")
-    list(APPEND GFLAGS_LIBRARY_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/lib")
-  endif()
-endif()
-
-if (GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION)
-  # Try to find an exported CMake configuration for gflags, as generated by
-  # gflags versions >= 2.1.
-  #
-  # We search twice, s/t we can invert the ordering of precedence used by
-  # find_package() for exported package build directories, and installed
-  # packages (found via CMAKE_SYSTEM_PREFIX_PATH), listed as items 6) and 7)
-  # respectively in [1].
-  #
-  # By default, exported build directories are (in theory) detected first, and
-  # this is usually the case on Windows.  However, on OS X & Linux, the install
-  # path (/usr/local) is typically present in the PATH environment variable
-  # which is checked in item 4) in [1] (i.e. before both of the above, unless
-  # NO_SYSTEM_ENVIRONMENT_PATH is passed).  As such on those OSs installed
-  # packages are usually detected in preference to exported package build
-  # directories.
-  #
-  # To ensure a more consistent response across all OSs, and as users usually
-  # want to prefer an installed version of a package over a locally built one
-  # where both exist (esp. as the exported build directory might be removed
-  # after installation), we first search with NO_CMAKE_PACKAGE_REGISTRY which
-  # means any build directories exported by the user are ignored, and thus
-  # installed directories are preferred.  If this fails to find the package
-  # we then research again, but without NO_CMAKE_PACKAGE_REGISTRY, so any
-  # exported build directories will now be detected.
-  #
-  # To prevent confusion on Windows, we also pass NO_CMAKE_BUILDS_PATH (which
-  # is item 5) in [1]), to not preferentially use projects that were built
-  # recently with the CMake GUI to ensure that we always prefer an installed
-  # version if available.
-  #
-  # [1] http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_package
-  find_package(gflags QUIET
-                      HINTS ${gflags_DIR} ${HOMEBREW_INSTALL_PREFIX}
-                      NO_MODULE
-                      NO_CMAKE_PACKAGE_REGISTRY
-                      NO_CMAKE_BUILDS_PATH)
-  if (gflags_FOUND)
-    message(STATUS "Found installed version of gflags: ${gflags_DIR}")
-  else(gflags_FOUND)
-    # Failed to find an installed version of gflags, repeat search allowing
-    # exported build directories.
-    message(STATUS "Failed to find installed gflags CMake configuration, "
-      "searching for gflags build directories exported with CMake.")
-    # Again pass NO_CMAKE_BUILDS_PATH, as we know that gflags is exported and
-    # do not want to treat projects built with the CMake GUI preferentially.
-    find_package(gflags QUIET
-                        NO_MODULE
-                        NO_CMAKE_BUILDS_PATH)
-    if (gflags_FOUND)
-      message(STATUS "Found exported gflags build directory: ${gflags_DIR}")
-    endif(gflags_FOUND)
-  endif(gflags_FOUND)
-
-  set(FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION ${gflags_FOUND})
-
-  # gflags v2.1 - 2.1.2 shipped with a bug in their gflags-config.cmake [1]
-  # whereby gflags_LIBRARIES = "gflags", but there was no imported target
-  # called "gflags", they were called: gflags[_nothreads]-[static/shared].
-  # As this causes linker errors when gflags is not installed in a location
-  # on the current library paths, detect if this problem is present and
-  # fix it.
-  #
-  # [1] https://github.com/gflags/gflags/issues/110
-  if (gflags_FOUND)
-    # NOTE: This is not written as additional conditions in the outer
-    #       if (gflags_FOUND) as the NOT TARGET "${gflags_LIBRARIES}"
-    #       condition causes problems if gflags is not found.
-    if (${gflags_VERSION} VERSION_LESS 2.1.3 AND
-        NOT TARGET "${gflags_LIBRARIES}")
-      message(STATUS "Detected broken gflags install in: ${gflags_DIR}, "
-        "version: ${gflags_VERSION} <= 2.1.2 which defines gflags_LIBRARIES = "
-        "${gflags_LIBRARIES} which is not an imported CMake target, see: "
-        "https://github.com/gflags/gflags/issues/110.  Attempting to fix by "
-        "detecting correct gflags target.")
-      # Ordering here expresses preference for detection, specifically we do not
-      # want to use the _nothreads variants if the full library is available.
-      list(APPEND CHECK_GFLAGS_IMPORTED_TARGET_NAMES
-        gflags-shared gflags-static
-        gflags_nothreads-shared gflags_nothreads-static)
-      foreach(CHECK_GFLAGS_TARGET ${CHECK_GFLAGS_IMPORTED_TARGET_NAMES})
-        if (TARGET ${CHECK_GFLAGS_TARGET})
-          message(STATUS "Found valid gflags target: ${CHECK_GFLAGS_TARGET}, "
-            "updating gflags_LIBRARIES.")
-          set(gflags_LIBRARIES ${CHECK_GFLAGS_TARGET})
-          break()
-        endif()
-      endforeach()
-      if (NOT TARGET ${gflags_LIBRARIES})
-        message(STATUS "Failed to fix detected broken gflags install in: "
-          "${gflags_DIR}, version: ${gflags_VERSION} <= 2.1.2, none of the "
-          "imported targets for gflags: ${CHECK_GFLAGS_IMPORTED_TARGET_NAMES} "
-          "are defined.  Will continue with a manual search for gflags "
-          "components.  We recommend you build/install a version of gflags > "
-          "2.1.2 (or master).")
-        set(FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION FALSE)
-      endif()
-    endif()
-  endif()
-
-  if (FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION)
-    message(STATUS "Detected gflags version: ${gflags_VERSION}")
-    set(GFLAGS_FOUND ${gflags_FOUND})
-    set(GFLAGS_INCLUDE_DIR ${gflags_INCLUDE_DIR})
-    set(GFLAGS_LIBRARY ${gflags_LIBRARIES})
-
-    # gflags does not export the namespace in their CMake configuration, so
-    # use our function to determine what it should be, as it can be either
-    # gflags or google dependent upon version & configuration.
-    #
-    # NOTE: We use the regex method to determine the namespace here, as
-    #       check_cxx_source_compiles() will not use imported targets, which
-    #       is what gflags will be in this case.
-    gflags_check_gflags_namespace_using_regex()
-
-    if (NOT GFLAGS_NAMESPACE)
-      gflags_report_not_found(
-        "Failed to determine gflags namespace using regex for gflags "
-        "version: ${gflags_VERSION} exported here: ${gflags_DIR} using CMake.")
-    endif (NOT GFLAGS_NAMESPACE)
-  else (FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION)
-    message(STATUS "Failed to find an installed/exported CMake configuration "
-      "for gflags, will perform search for installed gflags components.")
-  endif (FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION)
-endif(GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION)
-
-if (NOT GFLAGS_FOUND)
-  # Either failed to find an exported gflags CMake configuration, or user
-  # told us not to use one.  Perform a manual search for all gflags components.
-
-  # Handle possible presence of lib prefix for libraries on MSVC, see
-  # also GFLAGS_RESET_FIND_LIBRARY_PREFIX().
-  if (MSVC)
-    # Preserve the caller's original values for CMAKE_FIND_LIBRARY_PREFIXES
-    # s/t we can set it back before returning.
-    set(CALLERS_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
-    # The empty string in this list is important, it represents the case when
-    # the libraries have no prefix (shared libraries / DLLs).
-    set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "" "${CMAKE_FIND_LIBRARY_PREFIXES}")
-  endif (MSVC)
-
-  # Search user-installed locations first, so that we prefer user installs
-  # to system installs where both exist.
-  list(APPEND GFLAGS_CHECK_INCLUDE_DIRS
-    /usr/local/include
-    /usr/local/homebrew/include # Mac OS X
-    /opt/local/var/macports/software # Mac OS X.
-    /opt/local/include
-    /usr/include)
-  list(APPEND GFLAGS_CHECK_PATH_SUFFIXES
-    gflags/include # Windows (for C:/Program Files prefix).
-    gflags/Include ) # Windows (for C:/Program Files prefix).
-
-  list(APPEND GFLAGS_CHECK_LIBRARY_DIRS
-    /usr/local/lib
-    /usr/local/homebrew/lib # Mac OS X.
-    /opt/local/lib
-    /usr/lib)
-  list(APPEND GFLAGS_CHECK_LIBRARY_SUFFIXES
-    gflags/lib # Windows (for C:/Program Files prefix).
-    gflags/Lib ) # Windows (for C:/Program Files prefix).
-
-  # Search supplied hint directories first if supplied.
-  find_path(GFLAGS_INCLUDE_DIR
-    NAMES gflags/gflags.h
-    HINTS ${GFLAGS_INCLUDE_DIR_HINTS}
-    PATHS ${GFLAGS_CHECK_INCLUDE_DIRS}
-    PATH_SUFFIXES ${GFLAGS_CHECK_PATH_SUFFIXES})
-  if (NOT GFLAGS_INCLUDE_DIR OR
-      NOT EXISTS ${GFLAGS_INCLUDE_DIR})
-    gflags_report_not_found(
-      "Could not find gflags include directory, set GFLAGS_INCLUDE_DIR "
-      "to directory containing gflags/gflags.h")
-  endif (NOT GFLAGS_INCLUDE_DIR OR
-    NOT EXISTS ${GFLAGS_INCLUDE_DIR})
-
-  find_library(GFLAGS_LIBRARY NAMES gflags
-    HINTS ${GFLAGS_LIBRARY_DIR_HINTS}
-    PATHS ${GFLAGS_CHECK_LIBRARY_DIRS}
-    PATH_SUFFIXES ${GFLAGS_CHECK_LIBRARY_SUFFIXES})
-  if (NOT GFLAGS_LIBRARY OR
-      NOT EXISTS ${GFLAGS_LIBRARY})
-    gflags_report_not_found(
-      "Could not find gflags library, set GFLAGS_LIBRARY "
-      "to full path to libgflags.")
-  endif (NOT GFLAGS_LIBRARY OR
-    NOT EXISTS ${GFLAGS_LIBRARY})
-
-  # gflags typically requires a threading library (which is OS dependent), note
-  # that this defines the CMAKE_THREAD_LIBS_INIT variable.  If we are able to
-  # detect threads, we assume that gflags requires it.
-  find_package(Threads QUIET)
-  set(GFLAGS_LINK_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
-  # On Windows (including MinGW), the Shlwapi library is used by gflags if
-  # available.
-  if (WIN32)
-    include(CheckIncludeFileCXX)
-    check_include_file_cxx("shlwapi.h" HAVE_SHLWAPI)
-    if (HAVE_SHLWAPI)
-      list(APPEND GFLAGS_LINK_LIBRARIES shlwapi.lib)
-    endif(HAVE_SHLWAPI)
-  endif (WIN32)
-
-  # Mark internally as found, then verify. GFLAGS_REPORT_NOT_FOUND() unsets
-  # if called.
-  set(GFLAGS_FOUND TRUE)
-
-  # Identify what namespace gflags was built with.
-  if (GFLAGS_INCLUDE_DIR AND NOT GFLAGS_NAMESPACE)
-    # To handle Windows peculiarities / CMake bugs on MSVC we try two approaches
-    # to detect the gflags namespace:
-    #
-    # 1) Try to use check_cxx_source_compiles() to compile a trivial program
-    #    with the two choices for the gflags namespace.
-    #
-    # 2) [In the event 1) fails] Use regex on the gflags headers to try to
-    #    determine the gflags namespace.  Whilst this is less robust than 1),
-    #    it does avoid any interaction with msbuild.
-    gflags_check_gflags_namespace_using_try_compile()
-
-    if (NOT GFLAGS_NAMESPACE)
-      # Failed to determine gflags namespace using check_cxx_source_compiles()
-      # method, try and obtain it using regex on the gflags headers instead.
-      message(STATUS "Failed to find gflags namespace using using "
-        "check_cxx_source_compiles(), trying namespace regex instead, "
-        "this is expected on Windows.")
-      gflags_check_gflags_namespace_using_regex()
-
-      if (NOT GFLAGS_NAMESPACE)
-        gflags_report_not_found(
-          "Failed to determine gflags namespace either by "
-          "check_cxx_source_compiles(), or namespace regex.")
-      endif (NOT GFLAGS_NAMESPACE)
-    endif (NOT GFLAGS_NAMESPACE)
-  endif (GFLAGS_INCLUDE_DIR AND NOT GFLAGS_NAMESPACE)
-
-  # Make the GFLAGS_NAMESPACE a cache variable s/t the user can view it, and could
-  # overwrite it in the CMake GUI.
-  set(GFLAGS_NAMESPACE "${GFLAGS_NAMESPACE}" CACHE STRING
-    "gflags namespace (google or gflags)" FORCE)
-
-  # gflags does not seem to provide any record of the version in its
-  # source tree, thus cannot extract version.
-
-  # Catch case when caller has set GFLAGS_NAMESPACE in the cache / GUI
-  # with an invalid value.
-  if (GFLAGS_NAMESPACE AND
-      NOT GFLAGS_NAMESPACE STREQUAL "google" AND
-      NOT GFLAGS_NAMESPACE STREQUAL "gflags")
-    gflags_report_not_found(
-      "Caller defined GFLAGS_NAMESPACE:"
-      " ${GFLAGS_NAMESPACE} is not valid, not google or gflags.")
-  endif ()
-  # Catch case when caller has set GFLAGS_INCLUDE_DIR in the cache / GUI and
-  # thus FIND_[PATH/LIBRARY] are not called, but specified locations are
-  # invalid, otherwise we would report the library as found.
-  if (GFLAGS_INCLUDE_DIR AND
-      NOT EXISTS ${GFLAGS_INCLUDE_DIR}/gflags/gflags.h)
-    gflags_report_not_found(
-      "Caller defined GFLAGS_INCLUDE_DIR:"
-      " ${GFLAGS_INCLUDE_DIR} does not contain gflags/gflags.h header.")
-  endif (GFLAGS_INCLUDE_DIR AND
-    NOT EXISTS ${GFLAGS_INCLUDE_DIR}/gflags/gflags.h)
-  # TODO: This regex for gflags library is pretty primitive, we use lowercase
-  #       for comparison to handle Windows using CamelCase library names, could
-  #       this check be better?
-  string(TOLOWER "${GFLAGS_LIBRARY}" LOWERCASE_GFLAGS_LIBRARY)
-  if (GFLAGS_LIBRARY AND
-      NOT "${LOWERCASE_GFLAGS_LIBRARY}" MATCHES ".*gflags[^/]*")
-    gflags_report_not_found(
-      "Caller defined GFLAGS_LIBRARY: "
-      "${GFLAGS_LIBRARY} does not match gflags.")
-  endif (GFLAGS_LIBRARY AND
-    NOT "${LOWERCASE_GFLAGS_LIBRARY}" MATCHES ".*gflags[^/]*")
-
-  gflags_reset_find_library_prefix()
-
-endif(NOT GFLAGS_FOUND)
-
-# Set standard CMake FindPackage variables if found.
-if (GFLAGS_FOUND)
-  set(GFLAGS_INCLUDE_DIRS ${GFLAGS_INCLUDE_DIR})
-  set(GFLAGS_LIBRARIES ${GFLAGS_LIBRARY} ${GFLAGS_LINK_LIBRARIES})
-endif (GFLAGS_FOUND)
-
-# Handle REQUIRED / QUIET optional arguments.
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(Gflags DEFAULT_MSG
-  GFLAGS_INCLUDE_DIRS GFLAGS_LIBRARIES GFLAGS_NAMESPACE)
-
-# Only mark internal variables as advanced if we found gflags, otherwise
-# leave them visible in the standard GUI for the user to set manually.
-if (GFLAGS_FOUND)
-  mark_as_advanced(FORCE GFLAGS_INCLUDE_DIR
-    GFLAGS_LIBRARY
-    GFLAGS_NAMESPACE
-    gflags_DIR) # Autogenerated by find_package(gflags)
-endif (GFLAGS_FOUND)
diff --git a/examples/bundle_adjuster.cc b/examples/bundle_adjuster.cc
index d075d07..bd1281c 100644
--- a/examples/bundle_adjuster.cc
+++ b/examples/bundle_adjuster.cc
@@ -333,7 +333,7 @@
 }  // namespace ceres
 
 int main(int argc, char** argv) {
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   google::InitGoogleLogging(argv[0]);
   if (FLAGS_input.empty()) {
     LOG(ERROR) << "Usage: bundle_adjuster --input=bal_problem";
diff --git a/examples/circle_fit.cc b/examples/circle_fit.cc
index b58ce4e..e963988 100644
--- a/examples/circle_fit.cc
+++ b/examples/circle_fit.cc
@@ -107,7 +107,7 @@
 };
 
 int main(int argc, char** argv) {
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   google::InitGoogleLogging(argv[0]);
 
   double x, y, r;
diff --git a/examples/denoising.cc b/examples/denoising.cc
index 8af0cf0..a4bc4d2 100644
--- a/examples/denoising.cc
+++ b/examples/denoising.cc
@@ -252,7 +252,7 @@
 
 int main(int argc, char** argv) {
   using namespace ceres::examples;
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   google::InitGoogleLogging(argv[0]);
 
   if (FLAGS_input.empty()) {
diff --git a/examples/libmv_bundle_adjuster.cc b/examples/libmv_bundle_adjuster.cc
index 47d0cd7..2ab7d0d 100644
--- a/examples/libmv_bundle_adjuster.cc
+++ b/examples/libmv_bundle_adjuster.cc
@@ -780,7 +780,7 @@
 }  // namespace
 
 int main(int argc, char **argv) {
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   google::InitGoogleLogging(argv[0]);
 
   if (FLAGS_input.empty()) {
diff --git a/examples/more_garbow_hillstrom.cc b/examples/more_garbow_hillstrom.cc
index 02169cd..87713a0 100644
--- a/examples/more_garbow_hillstrom.cc
+++ b/examples/more_garbow_hillstrom.cc
@@ -580,7 +580,7 @@
 }  // namespace ceres
 
 int main(int argc, char** argv) {
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   google::InitGoogleLogging(argv[0]);
 
   using ceres::examples::Solve;
diff --git a/examples/nist.cc b/examples/nist.cc
index 017ae82..a9a066e 100644
--- a/examples/nist.cc
+++ b/examples/nist.cc
@@ -684,7 +684,7 @@
 }  // namespace ceres
 
 int main(int argc, char** argv) {
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   google::InitGoogleLogging(argv[0]);
   ceres::examples::SolveNISTProblems();
   return 0;
diff --git a/examples/powell.cc b/examples/powell.cc
index 614c9c6..bbb63d5 100644
--- a/examples/powell.cc
+++ b/examples/powell.cc
@@ -99,7 +99,7 @@
               "Minimizer type to use, choices are: line_search & trust_region");
 
 int main(int argc, char** argv) {
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   google::InitGoogleLogging(argv[0]);
 
   double x1 =  3.0;
diff --git a/examples/robot_pose_mle.cc b/examples/robot_pose_mle.cc
index 87def11..0076947 100644
--- a/examples/robot_pose_mle.cc
+++ b/examples/robot_pose_mle.cc
@@ -275,7 +275,7 @@
 
 int main(int argc, char** argv) {
   google::InitGoogleLogging(argv[0]);
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   // Make sure that the arguments parsed are all positive.
   CHECK_GT(FLAGS_corridor_length, 0.0);
   CHECK_GT(FLAGS_pose_separation, 0.0);
diff --git a/examples/slam/pose_graph_2d/pose_graph_2d.cc b/examples/slam/pose_graph_2d/pose_graph_2d.cc
index d53461b..0d9b047 100644
--- a/examples/slam/pose_graph_2d/pose_graph_2d.cc
+++ b/examples/slam/pose_graph_2d/pose_graph_2d.cc
@@ -155,7 +155,7 @@
 
 int main(int argc, char** argv) {
   google::InitGoogleLogging(argv[0]);
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
 
   CHECK(FLAGS_input != "") << "Need to specify the filename to read.";
 
diff --git a/examples/slam/pose_graph_3d/pose_graph_3d.cc b/examples/slam/pose_graph_3d/pose_graph_3d.cc
index dc35e5d..420d804 100644
--- a/examples/slam/pose_graph_3d/pose_graph_3d.cc
+++ b/examples/slam/pose_graph_3d/pose_graph_3d.cc
@@ -147,7 +147,7 @@
 
 int main(int argc, char** argv) {
   google::InitGoogleLogging(argv[0]);
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
 
   CHECK(FLAGS_input != "") << "Need to specify the filename to read.";
 
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index cc004ee..020a183 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -186,13 +186,13 @@
 
 if (NOT MINIGLOG AND GLOG_FOUND)
   list(APPEND CERES_LIBRARY_PUBLIC_DEPENDENCIES ${GLOG_LIBRARIES})
-  if (GFLAGS_FOUND)
+  if (gflags_FOUND)
     # If glog & gflags are both found, we assume that glog was built with
     # gflags, as it is awkward to perform a try_compile() to verify this
     # when gflags is an imported target (as it is in newer versions).
     # As glog #includes gflags/gflags.h in glog/logging.h if compiled with
     # gflags, it is thus a public dependency for Ceres in this case.
-    list(APPEND CERES_LIBRARY_PUBLIC_DEPENDENCIES ${GFLAGS_LIBRARIES})
+    list(APPEND CERES_LIBRARY_PUBLIC_DEPENDENCIES gflags)
   endif()
 endif (NOT MINIGLOG AND GLOG_FOUND)
 
@@ -339,12 +339,6 @@
   list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES_INCLUDE_DIRS
     ${AccelerateSparse_INCLUDE_DIRS})
 endif()
-if (GFLAGS AND NOT FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION)
-  # Only append gflags include directories if the gflags found was not a CMake
-  # exported target that already includes them.
-  list(APPEND CERES_LIBRARY_PUBLIC_DEPENDENCIES_INCLUDE_DIRS
-    ${GFLAGS_INCLUDE_DIRS})
-endif()
 # Add include locations for optional dependencies to the Ceres target without
 # duplication.
 list(REMOVE_DUPLICATES CERES_LIBRARY_PRIVATE_DEPENDENCIES_INCLUDE_DIRS)
@@ -380,10 +374,10 @@
   if (MINIGLOG)
     # When using miniglog, it is compiled into Ceres, thus Ceres becomes
     # the library against which other libraries should link for logging.
-    target_link_libraries(gtest PUBLIC ${GFLAGS_LIBRARIES} ceres)
+    target_link_libraries(gtest PUBLIC gflags ceres)
     target_link_libraries(test_util PUBLIC ceres gtest)
   else (MINIGLOG)
-    target_link_libraries(gtest PUBLIC ${GFLAGS_LIBRARIES} ${GLOG_LIBRARIES})
+    target_link_libraries(gtest PUBLIC gflags ${GLOG_LIBRARIES})
     target_link_libraries(test_util PUBLIC ceres gtest ${GLOG_LIBRARIES})
   endif (MINIGLOG)
 
diff --git a/internal/ceres/gmock_main.cc b/internal/ceres/gmock_main.cc
index 5800dc0..92d850c 100644
--- a/internal/ceres/gmock_main.cc
+++ b/internal/ceres/gmock_main.cc
@@ -64,6 +64,6 @@
   // gflags, InitGoogleTest() (called by InitGoogleMock()) must be called
   // before ParseCommandLineFlags() to handle & remove them before gflags
   // parses the remaining flags.
-  CERES_GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+  GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
   return RUN_ALL_TESTS();
 }
