CMake链接静态库libglfw3.a提示library not found错误咨询
问题原因
你在target_link_libraries中直接填写的lib/libglfw3.a是相对路径,CMake执行链接步骤时的工作目录并非项目根目录,会导致路径解析错误,ld链接器会把路径识别为库名的一部分拼接,才会出现-llib/libglfw3.a这种错误的链接参数,最终提示找不到库。
修复方案
以下两种常用写法都可以解决问题,任选其一即可:
方案1:用项目根目录拼接绝对路径
使用CMake内置变量PROJECT_SOURCE_DIR(代表当前CMakeLists.txt所在的项目根目录)拼接库的完整路径,直接修改target_link_libraries部分即可:
target_link_libraries(GLFWGLADSTUFF ${PROJECT_SOURCE_DIR}/lib/libglfw3.a )
如果需要提前校验库是否存在,可以补充如下判断:
set(GLFW_STATIC_LIB ${PROJECT_SOURCE_DIR}/lib/libglfw3.a) if(NOT EXISTS ${GLFW_STATIC_LIB}) message(FATAL_ERROR "GLFW静态库不存在,请检查路径:${GLFW_STATIC_LIB}") endif() target_link_libraries(GLFWGLADSTUFF ${GLFW_STATIC_LIB} )
方案2:先声明库搜索路径再链接
如果后续还要链接同目录下的其他静态库,可以先通过link_directories指定库所在文件夹,再直接写库名链接:
# 在add_executable代码行之前添加这一行,指定静态库搜索路径 link_directories(${PROJECT_SOURCE_DIR}/lib) # 后续target_link_libraries直接写库名即可 target_link_libraries(GLFWGLADSTUFF glfw3 )
额外注意事项
从报错的clang标识可以判断你是在MacOS环境编译,链接静态GLFW库还需要额外依赖系统框架,否则后续会出现符号未定义报错,可以在target_link_libraries中补充以下依赖:
target_link_libraries(GLFWGLADSTUFF ${PROJECT_SOURCE_DIR}/lib/libglfw3.a "-framework Cocoa" "-framework IOKit" "-framework CoreVideo" )
同时请确认你的libglfw3.a架构和当前编译目标架构匹配,如果是M系列芯片的Mac,需要确保静态库是arm64架构,否则也会出现链接失败问题。
内容的提问来源于stack exchange,提问作者user13351174
相关产品推荐
相关产品推荐

