如果我们想用相同的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函数的目标文件?
编辑: 对象库与主要功能一起使用非常好。事实证明我确实错误地包含了第二个主要内容。很抱歉发布它!
答案 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)