CMake对象库包含main

CMake Object Lib containing main

本文关键字:main 包含 对象 CMake      更新时间:2023-10-16

使用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)