如何通过命令行告诉CMake在本地文件夹中找到lib?

时间:2018-01-28 22:46:47

标签: cmake

我正在尝试在编译google-test时链接我的本地版本的gflags(位于〜/ mylibs / gflags中)。在gtest的CMakeLists.txt中,它使用了find_package:

if (WITH_GFLAGS)
  find_package (gflags 2.2.0)

  if (gflags_FOUND)
    set (HAVE_LIB_GFLAGS 1)
    determine_gflags_namespace (gflags_NAMESPACE)
  endif (gflags_FOUND)
endif (WITH_GFLAGS)

我不想修改CMakeLists.txt文件。有没有告诉cmake在我的文件夹中找到包?

谢谢!

2 个答案:

答案 0 :(得分:0)

gflags documentation描述了使用CMake时指定非标准安装的位置:

  

gflags_DIR变量必须设置为包含gflags-config.cmake文件的<prefix>/lib/cmake/gflags目录

在您的情况下,这可能如下所示:

cmake -Dgflags_DIR=/home/blackball/mylibs/gflags/lib/cmake/gflags [...]

答案 1 :(得分:0)

由于您正在将gflags作为子项目集成到超级cmake中,所以如果您在“元项目”源目录中拥有它,则基本上希望find_package()为无操作。这可以通过重载find_package()命令来完成。

热门CMakeLists.txt:

# Use find_package everywhere, no-op if it's a subproject
macro(find_package)
  if(NOT TARGET ${ARGV0} AND NOT TARGET ${ARGV0}::${ARGV0})
    _find_package(${ARGV})
  else()
    if(TARGET ${ARGV0})
        get_target_property(TGT_VER ${ARGV0} VERSION)
        set(TGT ${ARGV0})
    else()
        get_target_property(TGT_VER ${ARGV0}::${ARGV0} VERSION)
        set(TGT ${ARGV0}::${ARGV0})
    endif()
    message(STATUS "Found ${ARGV0}: CMake Target ${TGT} (found version \"${TGT_VER}\")")
    set(${ARGV0}_FOUND TRUE)
  endif()
endmacro()

注意:对于gflags,你可能需要“强制”gflags_NAMESPACE,因为gflags它不是二进制来源(参见glog问题ToDo)