gpt4 book ai didi

c++ - 包含 main 的 CMake Object Lib

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:44 28 4
gpt4 key购买 nike

使用 CMake,如果我们想创建具有相同主函数的不同可执行文件,我们可以创建一个包含主函数的库(例如,在 main.cpp 中)并将其链接到所有可执行文件:

add_library(main_lib main.cpp)
add_executable(exe1 source1.cpp)
target_link_libraries(exe1 main_lib)

其他可执行文件依此类推。然而,这样一来,我们必须为每个 exec 指定至少一个源文件。如果我们没有源文件,只想链接具有不同库的 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 函数的目标文件?

编辑:对象库与主要功能配合得很好。事实证明我确实错误地包含了第二个主要内容。抱歉发布!

最佳答案

使用对象库

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

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 -> 链接器 CXX,foo.c -> 链接器 C)。现在你需要明确地设置它:

set_target_properties(foo PROPERTIES LINKER_LANGUAGE CXX)

关于c++ - 包含 main 的 CMake Object Lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695527/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com