CMake的对象库含有主(CMake Object Lib containing main)

2019-10-20 21:34发布

随着CMake的,如果我们想用相同的主要功能创建不同的可执行文件,我们可以创建一个包含主函数库(这是在main.cpp ,说了)并将其链接到所有高管:

add_library(main_lib main.cpp)
add_executable(exe1 source1.cpp)
target_link_libraries(exe1 main_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

我们怎样才能重新使用包含在不同的可执行文件主要功能时,有没有其他的源文件,目标文件?

编辑:对象库可以非常好地主要功能。 原来我也有一个错误的第二主。 对不起,张贴!

Answer 1:

使用对象库

看起来你无意中链接库的目标:

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的无法确定的目标链接foo 。 这通常通过而分析的源列表( - >连接CXX,foo.c的 - >链接器C Foo.cpp中)来完成。 现在,你需要明确设置:

set_target_properties(foo PROPERTIES LINKER_LANGUAGE CXX)


文章来源: CMake Object Lib containing main
标签: c++ cmake