如何强制 CMake 链接到系统库而不是同名目标

Posted

技术标签:

【中文标题】如何强制 CMake 链接到系统库而不是同名目标【英文标题】:How to force CMake to link to system library instead of target with same name 【发布时间】: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 魔法,让我告诉它使用系统库。

【问题讨论】:

【参考方案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 将搜索库的位置数量。

【讨论】:

以上是关于如何强制 CMake 链接到系统库而不是同名目标的主要内容,如果未能解决你的问题,请参考以下文章

强制 CMake 寻找 x64 位库而不是 x32

cmake设置默认静态链接库

CMake:是不是可以仅从静态库而不是源代码构建可执行文件?

CMake RelWithDebInfo 链接到调试库

如何强制 Maven 使用我的本地存储库而不是去远程存储库检索工件?

如何强制CMake重新链接项目资源变化?