C++ CMake:如何为测试子目录项目重用对象文件?

C++ CMake:如何为测试子目录项目重用对象文件?,c++,cmake,C++,Cmake,我的项目是这样的: project ├── test │ ├── CMakeLists.txt │ ├── main.cpp │ └── test_class1.cpp ├── CMakeLists.txt ├── main.cpp ├── ... ├── class1.h └── class1.cpp 我想重用为project binary编译的class1.o。 默认的CMake行为也编译了两次用于测试。 我尝试使用对象库,但它将所有对象都放在这个库变量中。然后编译器打印 ma

我的项目是这样的:

project
├── test
│   ├── CMakeLists.txt
│   ├── main.cpp
│   └── test_class1.cpp
├── CMakeLists.txt
├── main.cpp
├── ...
├── class1.h
└── class1.cpp
我想重用为project binary编译的class1.o。 默认的CMake行为也编译了两次用于测试。 我尝试使用对象库,但它将所有对象都放在这个库变量中。然后编译器打印

main.cpp:(.text.startup+0x0):“main”的多个定义

这意味着在一个目标中有两个不同的main.o。以及主项目编译中的所有其他*.o文件


如何排除不需要的*.o文件?

我通常做的是将应用程序逻辑分离到一个静态库(子目录),然后由主应用程序和测试使用

您也可以将其保存在一个目录中,但在构建对象库时仍然需要排除main.cpp,因为否则,在构建测试时,确实会有多个定义
main
(定义在main.cpp和test main中)


如果要显式列出文件(即),只需从列表中省略main.cpp即可。如果使用globbing列出文件,则可以从列表中删除文件,如下所述:

我通常会将应用程序逻辑分离到一个静态库(子目录),然后由主应用程序和测试使用

您也可以将其保存在一个目录中,但在构建对象库时仍然需要排除main.cpp,因为否则,在构建测试时,确实会有多个定义
main
(定义在main.cpp和test main中)


如果要显式列出文件(即),只需从列表中省略main.cpp即可。如果您使用globbing列出文件,您可以从列表中删除该文件,如下所述:

您可以发布您的
makefile
?对象库肯定会有所帮助。如果没有,请在使用它的地方提供
CMakeLists.txt
。您可以发布
makefile
?对象库肯定会有所帮助。如果没有,请在使用它的位置提供
CMakeLists.txt
。如果您想在整个项目中轻松重用类,请将类编译成库。我决定使用“列表操作”。首先,我将所有主要项目源添加到SRC_列表中:
aux_source_目录(${project_source_DIR}SRC_列表)
然后我将一些源排除到对象库中以使它们共享:
set(shared_SRC${project_source_DIR}/event_bus.cpp${project_source DIR}/event.cpp)LIST(REMOVE_ITEM SRC_LIST${shared SRC})add_库(TESTING_OBJECTS OBJECT${SHARED_SRC})
现在我可以在主项目和类似的测试中使用这个预编译对象:
set(SRC_LIST${SRC_LIST}$)
this。如果您想在整个项目中轻松重用它们,请将类编译成库。我决定使用“列表操作”首先,我将所有主要项目源添加到SRC_列表中:
aux_source_目录(${project_source_DIR}SRC_列表)
然后我将一些源排除到对象库中以使它们共享:
set(shared_SRC${project_source_DIR}/event_bus.cpp${project_source DIR}/event.cpp)LIST(REMOVE_ITEM SRC_LIST${shared SRC})add_库(测试_OBJECTS OBJECT${SHARED_SRC})
现在我可以在主项目和类似的测试中使用这个预编译对象:
set(SRC_LIST${SRC_LIST}$)