关于这方面有数以万计的问题,但我读过的内容并没有帮助我解决我的问题,但如果我(很可能)错过了某些内容,请提前道歉。
我正在对一个大型项目进行单元测试,因此有多个CMakeLists.txt文件。我创建了一个" utilities.cpp"文件快速增长,所以我决定将其拆分为test_utilities.cpp和test_utilities.hpp。当我#include test_utilities.cpp
有欢乐时,但如果我#include test_utilities.hpp
构建失败:
Linking CXX executable foo
CMakeFiles/foo.dir/src/foo.cpp.o: In function `foo::bar()':
/mydir/trunk/tests/src/foo.cpp:57: undefined reference to `exit_on_invalid_config(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)'
collect2: ld returned 1 exit status
make[2]: *** [tests/foo] Error 1
make[1]: *** [tests/CMakeFiles/foo.dir/all] Error 2
make: *** [all] Error 2
我认为这是因为hpp和cpp没有被链接。
我尝试将此添加到CMakeLists.txt:
ADD_EXECUTABLE(utilities src/test_utilities.cpp src/test_utilities.hpp)
TARGET_LINK_LIBRARIES(utilities
some_project
test_main
boost_program_options)
(实际上这是之前的,减去hpp部分,当我在添加头文件之前包括utilities.cpp)。这个改变没有帮助,所以我尝试添加
ADD_LIBRARY(test_utilities src/test_utilities.cpp src/test_utilities.hpp)
并将test_utilities包含在TARGET_LINK_LIBRARIES中:
ADD_EXECUTABLE(foo src/foo.cpp)
TARGET_LINK_LIBRARIES(foo
some_project
test_main
test_utilities
boost_program_options)
但是当我尝试这个时,我得到了关于重新定义的提升废话的数以万计的错误。当我从foo.cpp中删除boost导入时,test_utilities.cpp / hpp我得到相同的输出或抱怨它无法找到提升定义。
我希望CMake做的是编译test_utilities可执行文件(cpp + hpp),这样当我尝试从foo.cpp导入test_utilities.hpp时,我就不会得到未定义的引用。
提前感谢您的帮助。
编辑:我遇到的另一个问题是,我将添加可执行文件test_utilities,但它不会在foo之前构建。我觉得这是我的问题的一部分,我还没有想出如何让test_utilities首先构建。
编辑:我首先使用ADD_DEPENDENCIES(foo utilities)
来构建实用程序,但我仍然得到未定义的引用:(
编辑:我现在遇到的问题是,构建失败,因为我得到&#34;&#34;&#34;的多重定义一切都在提升永远。
编辑:已解决!!!!!感谢wojciii !!!对于它的价值,我的问题归结为,我在test_utilities.cpp,test_main.cpp和foo.cpp中导入boost单元测试。我需要停止这样做,修复我的hpp中的依赖问题,并稍微调整一下CMakeLists.txt。