2013-07-04 45 views
8

这是我的CMakeLists.txt:CMake的不能找到所需的库

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我得到以下错误:

[email protected]:~/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) 

如何解决这个问题?

回答

11

你明白了。 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) 

看看在你的C进行FindGTest.cmake modules目录的详细信息。

您为什么得到错误消息的问题是find_package(GTest REQUIRED)无法在您的系统上找到gtest。使用REQUIRED参数,如果无法找到库(这实际上是在这里执行的正确操作),您请求CMake立即失败。

所以你需要做的是提供FindGTest的手段来找到你的图书馆。不幸的是,没有标准的方法来做到这一点,因为查找图书馆所需的信息因图书馆而异。所以你必须检查查找脚本的来源。

这会告诉你FindGTest依赖环境变量GTEST_ROOT来查找库。将该环境变量设置为gtest安装的路径,重新运行CMake,你应该没问题。

如果您的安装布局不同于FindGTest预期的布局,您可能需要编写自己的查找脚本。 CMake附带的查找脚本通常相当不错,但有时它们不适用于某些开箱即用的平台。如果您可以想出一个补丁来增加对您的平台的支持,那么将它与官方CMake发行版集成通常是没有问题的。

请注意,如果您打算自己构建gtest(而不是使用操作系统提供的二进制文件),那么使用查找脚本首先不是最好的主意。您应该改用imported target

+1

我已经安装了GTEST头到/ usr/inculde/GTEST和库到/ usr/lib中/ GTEST。那么什么是GTEST_ROOT?我仍然对此感到困惑。 – friko

+1

假设您使用[CMake 2.8.11的查找脚本](http://cmake.org/gitweb?p=cmake.git;a=blob;f=Modules/FindGTest.cmake;h=d531dd12d90fc0bdbb2fba424c448f4e9f69f4bf;hb = 0ad0c37206fce114c4e4c31f5270b53e181ab3c2),你的'GTEST_ROOT'必须是'/ usr'。这个脚本分别使用'include'和'lib'作为include和lib目录的后缀,所以你应该没问题。 – ComicSansMS

+0

导出GTEST_ROOT =/usr后,该命令我的cmake仍然失败,原因相同.. – friko