CMake,子目录和Google Test(模拟)没有正确链接。未找到测试

时间:2018-02-15 22:37:00

标签: c++ cmake

我有一个像这样的目录结构:

ProjectFolder
\--googletest (default google test layout)
|--source
|  \--test
|  |  \--CMakeLists.txt
|  |  |--test_Some.cpp
|  |--CMakeLists.txt
|  |--some.cpp
|  |--some.hpp
|--CMakeLists.txt
|--main.cpp (normal main)
|--maintest.cpp (empty)

ProjectFolder /的CMakeLists.txt:

project(ProjectFolder)

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/source
    ${gmock_SOURCE_DIR}/include
    ${gtest_SOURCE_DIR}/include
)
add_subdirectory(googletest)
add_subdirectory(source)

add_executable(ProjectFolderTest maintest.cpp)
target_link_libraries(ProjectFolderTest source sourceTest gmock gmock_main)

ProjectFolder /源/的CMakeLists.txt

add_library(source some.cpp)
add_subdirectory(test)

ProjectFolder /源极/测试/的CMakeLists.txt

add_library(sourceTest test_Some.cpp)

这可悲的是行不通。 sourceTest永远不会真正联系起来(似乎)。当我从source中删除target_link_libraries库时,我通常会期望未定义的引用,但即使这样也不会发生。 当我向test_Some.cpp添加#warning时,我确实看到了传递的警告。 如果我从sourceTest删除target_link_libraries并将add_executable的硬引用直接添加到source/test/test_Some.cpp,我会添加测试并运行正常。

如何使用add_subdirectories使其无法在一个CMakeLists.txt中添加所有文件?或者我应该做些什么呢?

(只是想学习如何使用CMake)。我无法使用建议的选项使用ExternalProject从interwebs下载googletest,因为我正在评估CMake的项目,我们必须在自己的VCS中包含特定版本。

1 个答案:

答案 0 :(得分:0)

我不太确定,但它可能与此issue相关联。

由于您没有发布您的测试源代码,我无法确定,如果您的解决方案应该有效,但我强烈推荐以下结构:

ProjectFolder
|--googletest (default google test layout)
\--source
|  |--CMakeLists.txt
|  |--main.cpp (normal main)
|  |--some.cpp
|  |--some.hpp
\--test
|  |--CMakeLists.txt
|  |--maintest.cpp (not empty)
|  |--test_Some.cpp
|--CMakeLists.txt

然后,测试的CMakeLists.txt可能如下所示:

enable_testing()
set(MY_TEST_FILES maintest.cpp
    test_Some.cpp)
add_executable(ut-myTest ${MY_TEST_FILES})
target_link_libraries(ut-myTest gmock SomeOtherLibrary)
add_test(MyTest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ut-myTest)

你的测试主要应该是这样的:

#include "gmock/gmock.h"

int main(int argc, char **argv) {
  ::testing::InitGoogleMock(&argc, argv);
  return RUN_ALL_TESTS();
}

编辑=====

只需澄清:add_test指令只允许您使用make test运行测试。只需执行二进制ut-myTest

,您仍然可以在没有它的情况下使用测试