Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从cmake链接cpp/hpp时出现问题_C++_Boost_Cmake - Fatal编程技术网

C++ 从cmake链接cpp/hpp时出现问题

C++ 从cmake链接cpp/hpp时出现问题,c++,boost,cmake,C++,Boost,Cmake,在这方面有无数的问题,但我所读到的都没有帮助我解决我的问题 我正在一个大型项目上进行单元测试,因此有多个CMakeLists.txt文件。我创建了一个utilities.cpp文件,该文件增长很快,因此我决定将其拆分为test_utilities.cpp和test_utilities.hpp。当我包括test_utilities.cpp时,会有乐趣,但如果我包括test_utilities.hpp,则构建失败: Linking CXX executable foo CMakeFiles/foo.

在这方面有无数的问题,但我所读到的都没有帮助我解决我的问题

我正在一个大型项目上进行单元测试,因此有多个CMakeLists.txt文件。我创建了一个utilities.cpp文件,该文件增长很快,因此我决定将其拆分为test_utilities.cpp和test_utilities.hpp。当我包括test_utilities.cpp时,会有乐趣,但如果我包括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
实际上,在添加头文件之前,在我包含utilities.cpp时,这是在这里,减去hpp部分。此更改没有帮助,因此我尝试添加

ADD_LIBRARY(test_utilities src/test_utilities.cpp src/test_utilities.hpp)
并将测试工具包含到目标链接库中:

ADD_EXECUTABLE(foo src/foo.cpp)                                                   
TARGET_LINK_LIBRARIES(foo
    some_project
    test_main
    test_utilities
    boost_program_options)
但当我尝试这一点时,我得到了错误的关于boost垃圾被重新定义。当我从foo.cpp、test_utilities.cpp/hpp中删除boost导入时,我要么得到相同的输出,要么抱怨找不到boost定义


我想让CMake做的是编译test_utilities可执行文件cpp+hpp,以便在尝试从foo.cpp导入test_utilities.hpp时不会得到未定义的引用

提前感谢你的帮助

编辑:我遇到的另一个问题是,我将添加可执行的test_实用程序,但它不是在foo之前构建的。我觉得这是我问题的一部分,我还没有弄清楚如何首先构建测试工具


编辑:多亏了wojciii!我的问题归结为,我在test_utilities.cpp、test_main.cpp和foo.cpp中导入了boost单元测试。我需要停止这样做,修复hpp中的依赖性问题,并稍微调整一下CMakeLists.txt。

我希望CMake做的是编译test_utilities.cpp,将其与test_utilities.hpp链接,并从foo.cpp导入test_utilities.hpp,而不使用未定义的引用垃圾。-您没有链接到头文件。这毫无意义。我建议您尝试编辑您的问题,并解释您需要帮助的内容:好吧,我的术语错了。值得一提的是,我只有几个月的C++经验。我以为整个过程是,你把cpp编译成a.o,把hpp编译成a.o,然后把它们链接成一个可执行文件???这通常是你需要做的,而且是开箱即用的。创建一个静态库。添加一个可执行文件。将可执行文件链接到静态库。这应该会给你一个可执行文件。你有一些示例代码我可以遵循吗?我不确定我应该做什么,我没有做。顺便说一句,再次谢谢你。怎么样?
ADD_EXECUTABLE(foo src/foo.cpp)                                                   
TARGET_LINK_LIBRARIES(foo
    some_project
    test_main
    test_utilities
    boost_program_options)