gpt4 book ai didi

c++ - 使用 cmake 强制链接静态库不起作用

转载 作者:行者123 更新时间:2023-12-02 13:16:57 24 4
gpt4 key购买 nike

我们有一个多项目 cmake 设置,其中包含一些IMPORTED 静态库。对于我们的一个可执行文件,我们需要强制链接其中一些 IMPORTED 库中的所有符号,因此我们需要在执行之前将 -Wl,-force_load 传递给编译器该图书馆的名称。请注意,这些导入的库之间存在依赖关系,因此需要在链接命令行中以正确的顺序放置它们。这些依赖项通过 set_target_properties(fake_2 PROPERTIES INTERFACE_LINK_LIBRARIES ...) 在根 CMakeLists.txt 中声明。

我们使用相当标准的 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_4fake_3。在某些情况下,它会删除重复的标志并将其仅应用于其中一个库。尝试解决这个问题,例如

target_link_libraries(lib_a PUBLIC "-Wl,-force_load $<TARGET_PROPERTY:fake_4,IMPORTED_LOCATION>")

导致链接器标志放置在库之前,但随后 cmake 无法识别导入的库,因此它会忽略它们之间的依赖关系。

可以在此处找到展示这些问题的完整示例项目:https://github.com/REVLUTION/cmake-example

注意:这是从 cmake discussion forums 移过来的如果您想查看其中的一些评论。

最佳答案

编辑:根据评论,这看起来实际上不起作用。

<小时/>

cake discussion forum发布了解决该问题的答案。我将其重新发布到此处以便于访问。

正如阿兰·马丁所说there :

I guess that’s because you need both:

  • target_link_libraries(utils_video_encode_decode_ffmpeg PUBLIC avfilter) for the “regular” dependency
  • target_link_libraries(utils_video_encode_decode_ffmpeg PUBLIC "-Wl,-force_load $<TARGET_PROPERTY:avfilter,IMPORTED_LOCATION>") for the “force load”

Putting them together:

target_link_libraries(utils_video_encode_decode_ffmpeg
PUBLIC
avfilter
"-Wl,-force_load $<TARGET_PROPERTY:avfilter,IMPORTED_LOCATION>"
)

关于c++ - 使用 cmake 强制链接静态库不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59204159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com