我们有一个多项目cmake设置,其中包括一些
我们曾经使用相当标准的
引起链接器标志位放置在库的前面,但是Cmake无法识别导入的库,因此忽略它们之间的依赖关系。
可以在此处找到一个完整的示例项目,展示了这些问题: https://github.com/REVLUTION/cmake-example 注意: 这个问题被转移到了Cmake论坛讨论版块中,如果你想看一些评论。
IMPORTED
静态库。对于我们的一个可执行文件,我们需要强制链接这些IMPORTED
库中的所有符号,因此我们需要在该库名称之前向编译器传递-Wl,-force_load
。请注意,这些导入库之间存在依赖关系,因此它们需要按正确顺序放置在链接命令行中。这些依赖关系是通过根CMakeLists.txt
中的set_target_properties(fake_2 PROPERTIES INTERFACE_LINK_LIBRARIES ...)
声明的。我们曾经使用相当标准的
target_link_libraries(lib_a PUBLIC -Wl,-force_load fake_4)
,但事实证明,cmake将-Wl,-force_load
视为相当任意的链接器标志,如果你将其应用于几个库,则会出现以下问题:target_link_libraries(lib_a PUBLIC -Wl,-force_load fake_4)
target_link_libraries(lib_a PUBLIC -Wl,-force_load fake_3)
它不一定会将这些链接器标志应用于fake_4
和fake_3
。在某些情况下,它将去重该标志并仅将其应用于其中一个库。尝试修复此问题的方式如下:
target_link_libraries(lib_a PUBLIC "-Wl,-force_load $<TARGET_PROPERTY:fake_4,IMPORTED_LOCATION>")
引起链接器标志位放置在库的前面,但是Cmake无法识别导入的库,因此忽略它们之间的依赖关系。
可以在此处找到一个完整的示例项目,展示了这些问题: https://github.com/REVLUTION/cmake-example 注意: 这个问题被转移到了Cmake论坛讨论版块中,如果你想看一些评论。
-force_load
对于链接到应用程序的动态库是有意义的(默认情况下,dll-s 是惰性加载的)。静态库只是成为可执行文件的一部分,因此它们没有单独的“加载”过程。 - Marek R-force_load
告诉编译器包括所有符号,即使它们似乎没有被使用。这对于像 TensorFlow 这样的东西是必要的,因为在编译时无法知道将调用哪些函数集合。 - Oliver Dain