在MacOS应用中使用CMake正确链接GLFW的方法是什么
正确CMake配置方案
完整可运行配置
cmake_minimum_required(VERSION 3.5) project(simple_repro) set(CMAKE_CXX_STANDARD 17) find_package(PkgConfig REQUIRED) # 明确请求静态库对应的依赖参数 pkg_search_module(GLFW REQUIRED STATIC glfw3) add_executable(app1 main.cpp glad.c) target_include_directories(app1 PRIVATE ${CMAKE_SOURCE_DIR} ${GLFW_STATIC_INCLUDE_DIRS} ) # 添加静态库搜索路径 target_link_directories(app1 PRIVATE ${GLFW_STATIC_LIBRARY_DIRS}) # 链接GLFW核心库 target_link_libraries(app1 PRIVATE ${GLFW_STATIC_LIBRARIES}) # 传递平台专属链接参数,SHELL前缀避免CMake修改参数格式 target_link_options(app1 PRIVATE "SHELL:${GLFW_STATIC_LDFLAGS_OTHER}")
兼容旧版CMake(低于3.12)的写法
如果你的CMake版本不支持SHELL:前缀,替换最后一行target_link_options为以下代码即可:
# 拆分链接参数为原生命令格式 separate_arguments(GLFW_STATIC_LDFLAGS_OTHER_LIST NATIVE_COMMAND "${GLFW_STATIC_LDFLAGS_OTHER}") # 转换为空格分隔的字符串写入链接参数 string(JOIN " " GLFW_STATIC_LINK_FLAGS ${GLFW_STATIC_LDFLAGS_OTHER_LIST}) set_target_properties(app1 PROPERTIES LINK_FLAGS "${GLFW_STATIC_LINK_FLAGS}")
原理解释
- 之前直接传入
${GLFW_STATIC_LDFLAGS}到target_link_libraries报错的原因是:CMake会对该接口传入的非路径、无前缀参数自动添加-l前缀,导致Cocoa这类framework名称被错误转换为-lCocoa。 GLFW_STATIC_LDFLAGS_OTHER变量存储了pkgconfig返回的所有非库类链接参数,也就是你需要的framework声明,通过target_link_options配合SHELL:前缀传递时,CMake会原样保留参数格式传递给链接器,不会做额外修改。- 该方案完全基于pkgconfig的输出,不需要硬编码任何平台专属的framework依赖,跨平台时不需要修改CMake配置。
内容的提问来源于stack exchange,提问作者triangle_man
相关产品推荐
相关产品推荐

