【问题标题】:Why isn't cmake locating gtest and gmock libs?为什么 cmake 不定位 gtest 和 gmock 库?
【发布时间】:2013-07-01 06:00:30
【问题描述】:

这是my project 的链接,以防万一。

所以,这是我的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 在那里显示它们。

【问题讨论】:

  • CMAKE_BINARY_DIR 是环境变量吗?

标签: c++ cmake shared-libraries googletest gmock


【解决方案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/

更新:这种方法现在也是part of the googletest documentation

【讨论】:

    【解决方案2】:

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

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

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

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

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

    我还有一些其他的小问题。

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

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

    【讨论】:

    • github上有一个FindGMock,但我还没试过。
    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2014-02-09
    • 2020-08-15
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多