如何让CMake的target_link_libraries()将依赖识别为目标而非系统路径文件?
解决CMake运行时搜索路径冲突:明确使用源码构建的zlog目标
这个警告的核心问题是CMake搞不清你要链接的是项目里源码构建的zlog还是系统已安装的zlog库,导致它生成的运行时搜索路径出现冲突。下面是具体的解决办法:
第一步:确认zlog的CMake目标名称
先去zlog子目录的CMakeLists.txt里看一眼,它生成的目标叫什么——一般要么是直接的zlog,要么是符合现代CMake规范的命名空间目标zlog::zlog。这一步很关键,因为我们要精准链接这个目标。
第二步:修改sysev的CMakeLists.txt,强制链接源码目标
在sysev的构建脚本里,我们要明确告诉CMake:别去系统找zlog,就用我们项目里已经导入的那个目标。
把你现有的sysev CMake代码改成这样:
# 先做个检查,确保zlog目标已经被根目录的add_subdirectory导入了 if(NOT TARGET zlog) # 如果你的zlog是命名空间目标,就把这里改成 NOT TARGET zlog::zlog message(FATAL_ERROR "没找到zlog目标!记得在sysev之前先add_subdirectory(zlog)哦") endif() add_library(sysev SHARED main.cpp) # 直接链接项目内的zlog目标,而不是让CMake自动搜索系统库 target_link_libraries(sysev PUBLIC zlog) # 如果是命名空间目标,就换成下面这行 # target_link_libraries(sysev PUBLIC zlog::zlog)
可选:彻底禁用系统库查找(如果还是有警告)
要是上面的操作后还能看到警告,就在sysev的CMakeLists开头加这两行,彻底切断CMake去系统找库的路径:
# 优先用项目内的配置目标,不用系统库 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) # 当前子目录下禁止去系统路径找库 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
原理说明
当你在根目录执行add_subdirectory(zlog)时,zlog的构建目标已经被加入到当前CMake项目的全局作用域里了。直接引用这个目标的话,CMake会自动关联它的所有编译参数、头文件路径和输出位置,完全不会去碰系统里的同名库,自然就不会有路径冲突的警告了。
内容的提问来源于stack exchange,提问作者kyb
相关产品推荐
相关产品推荐

