我有一个小的静态库,它需要boost标头,并且需要include目录中的“ include”目录。
...
add_library(alib STATIC ...)
target_include_directories(alib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_include_directories(alib PRIVATE ${Boost_INCLUDE_DIRS})
...
Run Code Online (Sandbox Code Playgroud)
我在alib的系统上有另一个安装,正是$ {Boost_INCLUDE_DIRS}指向的位置,但这是系统的其他软件包所需的较旧版本。关键是我想构建自定义版本的alib作为项目的目标。因此,非常重要的一点是,系统alib中的任何内容都不会包含或链接到该文件。
现在,我有另一个库mylib依赖于alib,因此我执行以下操作:
...
add_library(mylib STATIC ...)
target_link_libraries(mylib PUBLIC alib)
target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS})
...
Run Code Online (Sandbox Code Playgroud)
该target_link_libraries(mylib PUBLIC alib)调用适当加从包括alib但包括他们的后由第二行中指定包括target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS}),即使他们事后指定。
问题是${EXPAT_INCLUDE_DIRS}指向系统alib所在的包含路径。
它不应该的问题,如果CMake的将正确追加包括即被提供它们的顺序,目录中的那些target_link_libraries(mylib PUBLIC alib)那么的那些target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS})。
但是,cmake不遵守此顺序,而是在命令行末尾附加了target_link_libraries调用中的include目录,从而导致系统头文件而不是我的alib版本头文件被拾取。
我无法以任何方式更改alib目录的名称。我当前的解决方案是通过手动引用alib目标来破解对target_include_directories的自定义调用:
target_include_directories(mylib PUBLIC $<TARGET_PROPERTY:alib,INCLUDE_DIRECTORIES>)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?我怎么能强迫的CMake包含的目录alib 右远的target_link_directories电话,而不是之后?
不,您的“黑客”或多或少是文档中推荐的方式:
例如,如果目标的链接库必须按顺序指定
lib1lib2lib3,但包含目录必须按顺序指定lib3lib1lib2:Run Code Online (Sandbox Code Playgroud)target_link_libraries(myExe lib1 lib2 lib3) target_include_directories(myExe PRIVATE $<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>)
| 归档时间: |
|
| 查看次数: |
3930 次 |
| 最近记录: |