我有一个特殊的设置,但必要的业务外决策超出了我的控制范围。
我在Apple Silicon上运行macOS 12,具有Xcode 9.2,能够通过在Xcode包中指定实际编译器进行编译和链接,并将ar
和ranlib
的最新版本指定为CMake(Xcode 9.2版本在较新的系统上会出现运行时错误(,基本上如下所示:
-DCMAKE_C_COMPILER=/Applications/Xcode_10.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
-DCMAKE_CXX_COMPILER=/Applications/Xcode_10.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
-DCMAKE_OSX_SYSROOT=/Applications/Xcode_10.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
-DCMAKE_OSX_ARCHITECTURES=x86_64
-DCMAKE_AR=/usr/bin/ar
-DCMAKE_RANLIB=/usr/bin/ranlib
这些选项有效,例如Xcode 10.1工具可用,我们可以在较新的操作系统版本上构建软件,但在Xcode 9.2的情况下,我们无法链接OpenGL:
ld: can't map file, errno=22 file '/Applications/Xcode_9.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework' for architecture x86_64
由于传递给Clang:的命令行选项
/Applications/Xcode_9.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework
它似乎认为这是一个文件,而它是一个框架(目录(。手动将其更改为
-framework OpenGL
使一切按预期进行。但这不是CMake提供的。
现在的问题是:我如何让CMake使用这个选项,而不是只将OpenGL框架目录路径传递给Clang(对CMake文件的更改尽可能小(。我们目前使用OpenGL链接任何目标,使用find_package(OpenGL REQUIRED)
:提供的导入目标
target_link_libraries(... PRIVATE OpenGL::GL)
理想情况下,我希望保持这一点,因为我们的解决方案中有很多这样的东西。
更新:我遇到了一个额外的障碍,似乎是Qt5的cmake脚本也在我的OpenGL::GL使用之外添加了OpenGL框架目录。因此,也许更好的方法是在M1上找到一个功能性的ar/ranlib,它可以处理Xcode 9.2的ar/ranib所能处理的内容。
如果您想专门与-framework OpenGL
链接,您应该将target_link_libraries
行改为如下所示:
target_link_libraries(${PROJECT_NAME} LINK_PUBLIC "-framework OpenGL")
我相信这也消除了对find_package(OpenGL)
的需求。