我有一个像这样的目录结构:
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中包含特定版本。
答案 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
。