这里有一个类似的问题,Transitive target_include_directories on OBJECT libraries,但没有真正的解决方案。
如果我有一个依赖于项目的项目b,我可以按如下方式构建它们
add_library(a OBJECT ${a_srcs})
add_library(b OBJECT ${b_srcs})
当我想用他们构建一个excutable时,我可以写
add_executable(p ${p_srcs} $<TARGET_OBJECTS:b> $<TARGET_OBJECTS:a>)
有没有办法不必指定$<TARGET_OBJECTS:a>
?我认为这意味着以某种方式告诉CMake存在依赖性。如果我正在构建SHARED库而不是OBJECT,那么b项目将包含
target_link_libraries(b a)
创建了这种依赖关系,但我找不到OBJECT库的等效方法。
答案 0 :(得分:1)
就我所知,在当前设置中,否。目标add_executable
的{{1}}可以
你选择了(2)。我在这里看到的唯一其他选项是创建第三个库p
,它将c
和a
合并到一个完整的库中(请参阅Usage
section at the bottom,这可能是您的位置已经在寻找了。)
当你这样做时,你可以b
。编译后的target_link_libraries(c)
无法自行链接。您必须将源合并到可执行文件或库中才能使用它们。
您的OBJECT
来电可以被认为基本上是add_executable
,而不是编译add_executable(p ${p_srcs} ${a_srcs} ${b_srcs})
和a_srcs
(之前已经完成),只需复制已编译的对象而不是重做工作。这是一个非常简单/错误的解释,但这是一般的想法。