我正在尝试在编译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在我的文件夹中找到包?
谢谢!
答案 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)