【问题标题】:How to force CMake to link to system library instead of target with same name如何强制 CMake 链接到系统库而不是同名目标
【发布时间】:2015-09-10 14:51:47
【问题描述】:

我有一个与系统库同名的库。我项目中的大多数可执行文件都链接到我自己的库,但一个可执行文件需要链接到系统库。 CMake 正在生成一个链接到 ../foo/libfoo.a 的 g++ 命令行,我需要它来链接到 -lfoo。

我有一个类似这样的结构:

/CMakeLists.txt

add_directory(foo)
add_directory(program)

/foo/CMakeLists.txt

add_library(foo foo.cpp)

/program/CMakeLists.txt

add_executable(program program.cpp)
target_link_libraries(program foo)

一种解决方案是更改我的库的名称,这样它就不会发生冲突,但我宁愿不这样做,因为原因。我正在寻找一些 CMake 魔法,让我告诉它使用系统库。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    我宁愿不这样做,因为原因。

    我可以看到你的双手被绑在这里 :) 所以我建议使用 find_library“找到”系统库并链接到它。如果成功,find_library 将产生库的绝对路径,如果您在随后的 target_link_libraries 调用中使用该变量,它应该不会有歧义。

    所以在“/program/CMakeLists.txt”中,类似:

    find_library(SystemFoo NAMES foo)
    add_executable(program program.cpp)
    target_link_libraries(program ${SystemFoo})
    

    您甚至可能希望在 find_library 调用中包含一些 NO_xxx_PATH 参数(例如 NO_CMAKE_ENVIRONMENT_PATH 和/或 NO_CMAKE_PATH),以减少 CMake 将搜索库的位置数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      相关资源
      最近更新 更多