以下是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,一切都会正常编译.
我如何制作foo并foo_static自动使用(并根据它们转发内容)包含目录foo-object?
嗯,此刻我想出了以下内容:
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_link_library调用链接时才起作用。在您的情况下,您在foo-object和之间没有这样的链接foo。
如果向 中添加源文件foo,则该文件也应该无法看到foo-object.
这可能是OBJECT库设计中的一个疏忽,因为它本质上破坏了这些库的传递属性。
| 归档时间: |
|
| 查看次数: |
3924 次 |
| 最近记录: |