我试图将一个目录(/ source)中的文件包含到另一个目录(/ test)中的测试用例中,但是cmake无法找到/ source中的任何文件。
我的项目结构:
PrettyDD/
+ CMakeLists.txt
+ external/
+ CMakeLists.txt
+ gmock-1.7.0/
+ source/
+ CMakeLists.txt
+ parser.cpp
+ parser.h
+ main.cpp
+ ...
+ test/
+ CMakeLists.txt
+ test1.cpp
错误消息:
marcus@lean-machine:~/Programming/PrettyDD/build$ cmake ../ -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles"
-- Could NOT find Threads (missing: Threads_FOUND)
-- Could NOT find Threads (missing: Threads_FOUND)
-- Configuring done
CMake Error at test/CMakeLists.txt:12 (add_executable):
Cannot find source file:
parser.cpp
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
/test/CMakeLists.txt
:
set(GMOCK_DIR "${CMAKE_SOURCE_DIR}/external/gmock-1.7.0"
CACHE PATH "The path to the GoogleMock test framework.")
set_property(TARGET gtest APPEND_STRING PROPERTY COMPILE_FLAGS " -w")
include_directories(SYSTEM ${GMOCK_DIR}/gtest/include
${GMOCK_DIR}/include)
include_directories(SYSTEM "${PROJECT_SOURCE_DIR}/source")
function(add_gmock_test target)
add_executable(${target} ${ARGN})
target_link_libraries(${target} gmock_main)
add_test(${target} ${target})
add_custom_command(TARGET ${target}
POST_BUILD
COMMAND ${target}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Running ${target}" VERBATIM)
endfunction()
add_gmock_test(tests test1.cpp parser.cpp)
我已通过使用CMake ${PROJECT_SOURCE_DIR}/source
验证message()
指向正确的目录。
如果我在parser.cpp
中明确指定了../source/parser.cpp
(add_gmock_test()
)的路径,那么它就能找到该文件。
如果我首先在parser.cpp
中使用/source/CMakeLists.txt
(及其依赖关系)构建库,并将其添加到链接gmock_main
的位置,我也可以成功运行测试。
为什么CMake无法在parse.cpp
中找到/source
或任何其他文件?我做错了什么?
离开parser.cpp
add_gmock_test(tests test1.cpp)
会出现以下错误:
marcus@lean-machine:~/Programming/PrettyDD/build$ make
[ 55%] Built target PrettyDD
[ 66%] Built target gmock
[ 83%] Built target gmock_main
[ 88%] Built target gtest
[ 94%] Built target gtest_main
Linking CXX executable tests
CMakeFiles/tests.dir/test1.cpp.o: In function `Parser_Construct_Test::TestBody()':
/home/marcus/Programming/PrettyDD/test/test1.cpp:7: undefined reference to `Parser::Parser()'
collect2: error: ld returned 1 exit status
test/CMakeFiles/tests.dir/build.make:86: recipe for target 'test/tests' failed
make[2]: *** [test/tests] Error 1
CMakeFiles/Makefile2:316: recipe for target 'test/CMakeFiles/tests.dir/all' failed
make[1]: *** [test/CMakeFiles/tests.dir/all] Error 2
Makefile:86: recipe for target 'all' failed
make: *** [all] Error 2
这就是test1.cpp
的样子:
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "parser.h"
TEST(Parser, Construct) {
Parser parser;
}
parser.cpp
:s构造函数:
Parser::Parser() {
createFunctionMap();
}
在parser.h
中声明为:
class Parser {
public:
Parser();
...
构造函数应该没有任何问题,因为程序本身运行正常。那我为什么会收到这个错误?
答案 0 :(得分:1)
include_directories()仅更改包含目录的编译器参数,这意味着您可以使用
在测试代码中的某处包含“parser.h”#include "parser.h"
和... / PrettyDD / source搜索此文件。
我认为parser.cpp不包含测试代码。所以它不应该是你的测试项目的一部分:
add_gmock_test(tests test1.cpp)
应该够了。否则,您应该重新考虑您的项目结构。
或者您也可以使用:
add_gmock_test(tests test1.cpp ../source/parser.cpp)
编辑:
关于评论中的问题。几乎每个cmake命令的参数都是相对于$ {CMAKE_CURRENT_SOURCE_DIR}或$ {CMAKE_CURRENT_BINARY_DIR}。据我所知,cmake命令没有“include_directories”,但在列出源文件时我们也可以使用taget_sources()命令。
这意味着如果CMakeLists.txt与源文件是同一个文件夹,它应该写入:
target_sources(tests parser.cpp)
在'source'文件夹的CMakeLists.txt文件中。
可能存在问题,因为目标还不知道。我只在包含源的项目的子文件夹中使用了target_sources()。因此我使用类似于以下的结构:
其中src和inc文件夹还包含一个CMakeLists.txt文件,该文件使用target_sources()命令显式列出源文件。