CMake Include dependencies of imported library wit

2019-06-11 21:49发布

I am using CMake 3.5.2.

Consider the following situation. I have an imported library Foo::Foo:

add_library(Foo::Foo UNKNOWN IMPORTED)

This imported library has been populated with appropriate properties:

set_target_properties(Foo::Foo PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "/path/to/include/blah" "/another/path/include/other"
  IMPORTED_LINK_INTERFACE_LIBRARIES blah other
  IMPORTED_LOCATION "/path/to/libfoo.a-or-so")

I have a convenience library called bar. I need it to include Foo::Foo's include directories, but I do not want it to link against Foo::Foo.

add_library(bar STATIC "${BAR_SOURCES}")

How can I add just the include dependencies from Foo::Foo? Here is what I have tried that has failed:

# This did not include any includes from Foo::Foo
target_link_libraries(bar INTERFACE Foo::Foo)

# This included only the first include directory from Foo::Foo
target_include_directories(bar PUBLIC "$<TARGET_PROPERTY:Foo::Foo,INTERFACE_INCLUDE_DIRECTORIES>")

标签: cmake
1条回答
SAY GOODBYE
2楼-- · 2019-06-11 22:23

I have given you example a try. You should change the code in your example to:

set_target_properties(
   Foo::Foo PROPERTIES
       INTERFACE_INCLUDE_DIRECTORIES 
           "/path/to/include/blah;/path/to/include/other"
       IMPORTED_LINK_INTERFACE_LIBRARIES "blah.a"
       IMPORTED_LOCATION "/path/to/libfoo.a-or-so"
 )

The call to set_target_properties() only accepts "property" / "value" pairs (with spaces as delimiter). And your example just wasn't throwing any errors because you can always define your own properties (with any naming).

Please transfer your include directory list into a "CMake List" (string with semicolon separated elements).

Alternative

If you just want to "reset" the transitive libraries you can do this with e.g.:

target_link_libraries(bar Foo::Foo)
set_target_properties(bar PROPERTIES INTERFACE_LINK_LIBRARIES "")

I've used this approach when I was building a shared library in the same project as I was linking against the same (and I did not want the library dependencies of the shared library also being linked into the target using the shared library).

References

查看更多
登录 后发表回答