包含主要的CMake Object Lib

时间:2014-09-05 23:59:59

标签: c++ cmake

如果我们想用相同的main函数创建不同的可执行文件,我们就可以创建一个包含main函数的库(比如main.cpp),并通过以下方式将它链接到所有的exec:

add_library(main_lib main.cpp)
add_executable(exe1 source1.cpp)
target_link_libraries(exe1 main_lib)
其他可执行文件的

等等。但是,这样,我们必须为每个exec指定至少一个源文件。如果我们没有源文件并且只想将高管与不同的库链接会怎么样?

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

如果没有其他源文件,我们如何在不同的可执行文件中重用包含main函数的目标文件?

编辑: 对象库与主要功能一起使用非常好。事实证明我确实错误地包含了第二个主要内容。很抱歉发布它!

1 个答案:

答案 0 :(得分: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

问题

对于某些生成器,对象库方法可能不起作用*。见documentation

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的链接器。通常这通过分析源列表来完成(foo.cpp - &gt;链接器CXX,foo.c - &gt;链接器C)。现在你需要明确地设置它:

set_target_properties(foo PROPERTIES LINKER_LANGUAGE CXX)