0

这是我的项目的链接,以防万一。

所以,这是我的CMakeLists.txt文件:

cmake_minimum_required (VERSION 2.6)
enable_testing()

project (IeiuniumTela)
set (IeiuniumTela_VERSION_MAJOR 1)
set (IeiuniumTela_VERSION_MINOR 0)
set (IeiuniumTela_VERSION_PATCH 0)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/bin)

# TODO:  Make conditional for OS X compilation
set(CMAKE_CXX_COMPILER g++-4.7)
set(CMAKE_CC_COMPILER gcc-4.7)

# TODO:  Require gcc >= 4.7

set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/http/request.cpp")
set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/http/response.cpp")
set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/http/server.cpp")
set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/log.cpp")
set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/main.cpp")

set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "-Wall ${CMAKE_CXX_FLAGS}")

add_executable(ieiunium_tela.srv ${SOURCES})

target_link_libraries(ieiunium_tela.srv yaml-cpp)
target_link_libraries(ieiunium_tela.srv boost_system-mt)

set(GTEST_DIR "${CMAKE_BINARY_DIR}/../gtest-1.6.0")
include_directories(SYSTEM "${GTEST_DIR}/include")
find_library(GTEST_LIBRARY 
                NAMES gtest 
                      libgtest 
                      libgtest.a 
                PATHS "${GTEST_DIR}")
find_library(GTEST_LIBRARY_MAIN 
                NAMES gtest_main 
                      libgtest_main 
                      libgtest.a 
                PATHS "${GTEST_DIR}")

set(GMOCK_DIR "${CMAKE_BINARY_DIR}/../gmock-1.6.0")
include_directories(SYSTEM "${GMOCK_DIR}/include")
include_directories(SYSTEM "${GMOCK_DIR}/gtest/include")
find_library(GMOCK_LIBRARY 
                NAMES gmock 
                      libgmock 
                      libgmock.a 
                PATHS "${GMOCK_DIR}")
find_library(GMOCK_LIBRARY_MAIN 
                NAMES gmock_main 
                      libgmock_main  
                      libgmock_main.a  
                PATHS "${GMOCK_DIR}")

set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/http/test_request.cpp")
set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/http/test_response.cpp")
set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/http/test_server.cpp")
set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/test_log.cpp")
set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/test_main.cpp")
add_executable(ieiunium_tela.srv_TEST ${TEST_SOURCES})
target_link_libraries(ieiunium_tela.srv_TEST ${GTEST_LIBRARY} ${GTEST_LIBRARY_MAIN})
target_link_libraries(ieiunium_tela.srv_TEST ${GMOCK_LIBRARY} ${GMOCK_LIBRARY_MAIN})

而且,这是我的问题:为什么 cmake 找不到我的 gtest/gmock 库?

我已经进入了他们各自的目录并使用它们构建了它们,共享库./configure && make -j4的简要说明在那里显示了它们。find

4

2 回答 2

1

另一种选择是将 gtest 和 gmock 构建为主要 CMake 构建的一部分,而不是单独构建它们并使用 find_package() 或 find_library()。这具有一些优点,包括:

  • 它们使用与主构建相同的编译器和设置构建,因此不会出现符号不匹配等问题。
  • 在构建之前不需要手动步骤,也不需要告诉 CMake 在你的主 CMakeLists.txt 中哪里可以找到东西。

我最近写了一篇关于如何在构建过程中下载和构建 gtest 的文章。与更常见的建议方法不同,我的文章展示了如何在配置期间(即运行 CMake 时)下载 gtest,然后允许您使用 add_subdirectory() 将其带入您的项目。这使得 gtest 和 gtest_main CMake 目标直接可用于您的项目,因此您可以像任何其他库一样链接它们。该方法是通用的,也可能适用于模拟。你可以在这里找到那篇文章:

https://crascit.com/2015/07/25/cmake-gtest/

更新:这种方法现在也是googletest 文档的一部分

于 2015-07-25T22:54:41.647 回答
0

gtest/gmock 库不是针对这些项目的实际根目录构建的。我相信在 Linux 上,它们被构建为根目录内的“lib”。

要告诉 CMake 在“lib”中搜索但不修改您的GTEST_DIRGMOCK_DIR变量,您可以使用命令的PATH_SUFFIXES参数find_library

find_library(GTEST_LIBRARY 
                NAMES gtest 
                      libgtest 
                      libgtest.a 
                PATHS "${GTEST_DIR}"
                PATH_SUFFIXES lib)

如果需要,您也可以添加后缀列表以提供适用于 Windows 构建的值。

提供了一个标准 CMake 模块来查找 gtest ( FindGTest)。您可以查看其中的代码以获取想法,或者实际使用它而不是您自己的代码。不幸的是,没有FindGMock模块。

我还有其他一些小问题。

可能值得考虑允许用户通过标志设置GTEST_DIR和变量,以允许这些变量存在于相对于项目根目录的任何位置。在这种情况下,您只需将它们设置在 CMakeLists.txt 中(如果它们尚未设置)。GMOCK_DIR-D

另一个小问题是 GMock 附带了 GTest。您可以只允许用户构建 GMock,然后在 GMock 树中查找并使用该版本。

于 2013-07-01T08:41:22.113 回答