如何强制 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:是不是可以仅从静态库而不是源代码构建可执行文件?