CMake无法找到所需的库。

12

这是我的CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

# Locate GTest
find_package(GTest REQUIRED)
include_directories(/usr/include/gtest)

# Link runTests with what we want to test and the GTest and pthread library
add_executable(runTests gtest.cpp)
target_link_libraries(runTests /usr/lib/gtest pthread)

当运行cmake时,我遇到了以下错误:

michael@michaelFriko:~/workspace/gtest/src$ cmake CMakeLists.txt
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message):
  Could NOT find GTest (missing: GTEST_LIBRARY GTEST_MAIN_LIBRARY)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindGTest.cmake:150 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:8 (find_package)

如何解决这个问题?

2个回答

16

你搞反了。 find_package 命令应该为你找到 gtest 库的位置。你不需要再手动指定包含文件和库文件的路径:

# Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

# Link runTests with what we want to test and the GTest and pthread library
add_executable(runTests my_test.cpp)
target_link_libraries(runTests ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread)

请查看您的CMake模块目录中的FindGTest.cmake以获取详细信息。

出现错误消息的原因是find_package(GTest REQUIRED)无法在您的系统上找到gtest。使用REQUIRED参数要求CMake立即失败,如果无法找到库(这实际上是正确的做法)。

所以您需要做的就是提供FindGTest定位库的方式。不幸的是,并没有标准的方法来做到这一点,因为找到库所需的信息因库而异。因此,您将不得不查看查找脚本的源代码。

这将告诉您FindGTest依赖于环境变量GTEST_ROOT来查找库。将该环境变量设置为您的gtest安装路径,重新运行CMake即可。

如果您的安装布局与FindGTest期望的不同,则可能需要编写自己的查找脚本。随CMake一起提供的查找脚本通常非常好用,但有时它们在某些平台上不能直接使用。如果您能够提供一个补丁来支持您的平台,则通常可以将其集成到官方CMake发行版中。

请注意,如果您打算自己构建gtest(而不是使用操作系统提供的二进制文件),则首先使用查找脚本并不是最好的想法。您应该使用一个导入目标


1
我已经将 gtest 头文件安装到 /usr/include/gtest,库文件安装到 /usr/lib/gtest。那么 GTEST_ROOT 是什么?我仍然对此感到困惑。 - friko
1
假设您正在使用CMake 2.8.11中的查找脚本,那么您的GTEST_ROOT应该是/usr。该脚本使用includelib作为包含目录和库目录的后缀,所以您应该没问题。 - ComicSansMS
1
你的gtest库是否位于/usr/lib目录下的gtest子目录中?因为这样不行。你需要将libgtest.*文件直接放在/usr/lib/中,而非其子目录中。 - ComicSansMS
是的,这两个库 libgtest.a 和 libgtest_main.a 位于 /usr/lib/gtest/ 下。我会将它们放到 usr/lib 目录下并再次尝试。 - friko
好的,问题在于库文件位于 /usr/lib/gtest 而不是 /usr/lib。将这些库文件复制到正确的目录后,它就可以工作了。但是,我希望将所有外部库(如 gtest、gmock 和 boost)放在单独的目录中,例如 /usr/lib/gtest、/usr/lib/gmock 和 /usr/lib/boost。CMake 在查找上述目录中的库文件时失败了。如何实现这一点? - friko
显示剩余3条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接