Linux下如何为CMake的find_package()指定SFML库的额外链接目录?
我之前也碰到过类似的情况——把库放到系统默认路径的子目录后,CMake的find_package就找不到了,核心原因是CMake默认不会递归搜索系统库路径的子目录,而且find_package优先依赖库的配置文件(比如SFMLConfig.cmake),不是直接找.so/.a文件。下面给你几个靠谱的解决思路:
方法1:指定SFML的配置文件路径
SFML安装时会生成SFMLConfig.cmake这类配置文件,通常在lib/cmake/SFML目录下。如果你把SFML整个放到了/usr/local/lib/SFML,那配置文件大概率在/usr/local/lib/SFML/lib/cmake/SFML。你可以直接在CMakeLists.txt里指定这个路径:
# 一定要放在find_package之前设置 set(SFML_DIR "/usr/local/lib/SFML/lib/cmake/SFML") find_package(SFML REQUIRED COMPONENTS system window graphics)
或者在执行cmake命令时通过参数传递:
cmake .. -DSFML_DIR=/usr/local/lib/SFML/lib/cmake/SFML
方法2:添加库路径到CMake的搜索列表
如果只是库文件在/usr/local/lib/SFML,可以把这个路径加入CMAKE_LIBRARY_PATH,让CMake能定位到库文件:
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "/usr/local/lib/SFML") find_package(SFML REQUIRED COMPONENTS system window graphics)
不过这个方法不如方法1靠谱,因为find_package还是优先找配置文件,要是配置文件不在正确位置,可能还是会出问题。
方法3:重新安装SFML到标准路径
手动移动库文件很容易打乱CMake的搜索逻辑,最稳妥的方式是重新编译安装SFML,指定标准的安装前缀/usr/local:
# 进入SFML源码目录 cd sfml-source mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install
这样SFML会自动把库文件放到/usr/local/lib,头文件到/usr/local/include,配置文件到/usr/local/lib/cmake/SFML,find_package不用额外配置就能正常找到。
为什么之前放/usr/local/lib没问题?
因为/usr/local/lib是CMake默认的系统库搜索路径之一,而且SFML的配置文件也在默认的搜索路径里(比如/usr/local/lib/cmake/SFML),所以find_package能自动定位到。但你把整个SFML放到子目录后,配置文件和库文件的路径都不在CMake的默认搜索范围内了,自然找不到。
内容的提问来源于stack exchange,提问作者Dincio

