CMake对象库包含main
CMake Object Lib containing main
使用CMake,如果我们想用相同的主函数创建不同的可执行文件,我们可以创建一个包含主函数的库(比如说,它在main.cpp
中),并通过以下方式将其链接到所有执行程序:
add_library(main_lib main.cpp)
add_executable(exe1 source1.cpp)
target_link_libraries(exe1 main_lib)
等等用于其他可执行文件。然而,通过这种方式,我们必须为每个exec指定至少一个源文件。如果我们没有源文件,只想将exec与不同的lib链接起来,该怎么办?
add_executable(exe1) #(1)
target_link_libraries(exe1 some_lib1 main_lib)
不幸的是,CMake不允许(1)
。我们可以使用一个Object Library
:
add_library(main_lib OBJECT main.cpp)
add_executable(exe1 $<TARGET_OBJECTS:main_lib>) #(2)
target_link_libraries(exe1 some_lib1)
但(2)
会产生以下结果:
CMakeFiles/main_obj.dir/test_caffe_main.cpp.o: In function `main':
test_caffe_main.cpp:(.text+0x0): multiple definition of `main'
CMakeFiles/test_caffe_main.testbin.lib.dir/test_caffe_main.cpp.o:test_caffe_main.cpp:(.text+0x0): first defined here
当没有其他源文件时,我们如何在不同的可执行文件中重用包含主函数的对象文件?
编辑:对象库与主要功能配合得很好。事实证明,我确实错误地加入了第二个主旋律。很抱歉发布它!
使用对象库
看起来您无意中将库链接到目标:
add_library(with_main OBJECT main.cpp)
add_executable(foo $<TARGET_OBJECTS:with_main>) # Target without any source files
# target_link_libraries(foo with_main) # Not needed here
问题
对象库方法可能不适用于某些生成器。参见文档:
Some native build systems may not like targets that have only object files,
so consider adding at least one real source file to any
target that references $<TARGET_OBJECTS:objlib>
*我之前在Xcode上遇到了一些问题,但现在我测试了这个例子,它可以工作(cmake 3.0.1由自制软件安装)
没有对象
你可以在没有对象的情况下完成(只需传递空字符串):
add_library(with_main main.cpp)
add_executable(foo "")
target_link_libraries(foo with_main)
但在这种情况下,CMake不能确定目标CCD_。通常这是通过分析源列表(foo.cpp->linker CXX,foo.c->linker c)来完成的。现在您需要明确设置:
set_target_properties(foo PROPERTIES LINKER_LANGUAGE CXX)
相关文章:
- main.cpp 如何知道包含标头的源文件?
- 当我有多个类时,我应该以线性样式包含它们还是只包含在 main.cpp 中?
- 在 main.cpp 以外的文件中包含标头时出现链接器错误
- 如何将包含多个.cpp源文件的文件夹导入Eclipse项目中,每个源文件都有一个main()定义
- 如何在 main 中使用包含对节点的引用调用函数
- 为什么在包含类头的情况下,我的数组在main中未定义
- 编码 NDK main() 与许多包含
- main() 方法中包含的类
- main中的标头包含.cpp有效,但在类中抛出错误
- 对于我的C ++项目,我在Eclipse中创建了子文件夹,如何将其包含在main中
- 在 main 中包含基类和继承类的标头
- 使用模板类时,似乎无法包含除 main 以外的任何 cpp 文件.cpp
- CMake对象库包含main
- 在Main.cpp中包含头文件有限制吗?
- 如何在另一个包含对象的文件中创建一个函数并从 main 调用它
- 为什么静态库包含main函数
- 我应该使用main.cpp中包含的哪一个(LNK2005已经定义)
- 在main中包含cpp文件时的编译错误:内联函数与非内联函数
- 如何在main.cpp之外的其他文件中包含OTL头文件
- 检查Windows下静态库中是否包含main函数