OBJECT库上的传递target_include_directories

gra*_*olf 17 cmake

以下是make CMakeLists.txt的片段:

add_library(foo-object OBJECT src/foo.cpp)
target_include_directories(foo-object PUBLIC include)
add_library(foo SHARED $<TARGET_OBJECTS:${PROJECT_NAME}-object>)
add_library(foo_static STATIC $<TARGET_OBJECTS:${PROJECT_NAME}-object>)
Run Code Online (Sandbox Code Playgroud)

现在,这一切都很好,两个库都生成了.但是当我尝试使用它时遇到问题:

add_executable(bar src/main.cpp)
target_link_libraries(bar foo)
Run Code Online (Sandbox Code Playgroud)

Target bar不编译,因为不传播来自foo-object的include目录.如果我也target_include_directories直接添加foo,一切都会正常编译.

我如何制作foofoo_static自动使用(并根据它们转发内容)包含目录foo-object

gra*_*olf 7

嗯,此刻我想出了以下内容:

add_library(foo-object OBJECT src/foo.cpp)
target_include_directories(foo-object PUBLIC include)

get_property(object_include_dirs TARGET foo-object PROPERTY INCLUDE_DIRECTORIES)
get_property(object_link_libs TARGET foo-object PROPERTY LINK_LIBRARIES)

add_library(foo SHARED $<TARGET_OBJECTS:${PROJECT_NAME}-object>)
target_include_directories(foo PUBLIC ${object_include_dirs})
target_link_libraries(foo PUBLIC ${object_link_libs})

add_library(foo_static STATIC $<TARGET_OBJECTS:${PROJECT_NAME}-object>)
target_include_directories(foo_static PUBLIC ${object_include_dirs})
target_link_libraries(foo_static PUBLIC ${object_link_libs})
Run Code Online (Sandbox Code Playgroud)

但是来吧,必须有更好的方法:/

  • 因此,仅仅“ target_include_directories(foo PUBLIC $ {object_include_dirs})”还不够吗?也许使用[generator expression](https://cmake.org/cmake/help/v3.0/manual/cmake-generator-expressions.7.html)`$ &lt;TARGET_PROPERTY:tgt,prop&gt;`以避免获取线? (2认同)

Com*_*sMS 7

似乎传递属性仅在目标通过一系列target_link_library调用链接时才起作用。在您的情况下,您在foo-object和之间没有这样的链接foo

如果向 中添加源文件foo,则该文件也应该无法看到foo-object.

这可能是OBJECT库设计中的一个疏忽,因为它本质上破坏了这些库的传递属性。