【问题标题】:CMake: How to reuse an object files for the tests subdirectory project?CMake:如何为测试子目录项目重用目标文件?
【发布时间】:2017-02-01 08:40:11
【问题描述】:

我的项目是这样的:

project
├── test
│   ├── CMakeLists.txt
│   ├── main.cpp
│   └── test_class1.cpp
├── CMakeLists.txt
├── main.cpp
├── ...
├── class1.h
└── class1.cpp

我想重用为项目二进制文件编译的 class1.o。 默认的 CMake 行为也编译了两次以进行测试。 我尝试使用 OBJECT 库,但它将所有对象都放在这个库变量中。然后编译打印

main.cpp:(.text.startup+0x0): `main'的多重定义

这意味着一个目标中有 2 个不同的 main.o。主项目编译中的所有其他 *.o 文件都是。

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

【问题讨论】:

  • 你能发布你的makefile吗?
  • OBJECT 库肯定会有所帮助。如果没有,请提供CMakeLists.txt 你在哪里使用它。

标签: c++ cmake


【解决方案1】:

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

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

如果您明确列出文件(即highly recommended for CMake),您可以简单地从列表中省略 main.cpp。如果您使用 globbing 列出文件,则可以按照此处所述从列表中删除该文件:How do I exclude a single file from a cmake `file(GLOB ... )` pattern?

【讨论】:

  • 这个。如果您想在整个项目中轻松重用类,请将它们编译到库中。
  • 我决定使用“列表操作”。首先,我将所有主项目源添加到 SRC_LIST:aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST) 然后我将一些源排除到对象库以使其共享:set(SHARED_SRC ${PROJECT_SOURCE_DIR}/event_bus.cpp ${PROJECT_SOURCE_DIR}/event.cpp) list(REMOVE_ITEM SRC_LIST ${SHARED_SRC}) add_library(TESTING_OBJECTS OBJECT ${SHARED_SRC}) 现在我可以在主项目和测试中使用这个预编译对象,如下所示:set(SRC_LIST ${SRC_LIST} $<TARGET_OBJECTS:TESTING_OBJECTS>)跨度>
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
相关资源
最近更新 更多