在蒙特利的CMake中与Xcode 9.2 OpenGL框架链接



我有一个特殊的设置,但必要的业务外决策超出了我的控制范围。

我在Apple Silicon上运行macOS 12,具有Xcode 9.2,能够通过在Xcode包中指定实际编译器进行编译和链接,并将arranlib的最新版本指定为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)的需求。

最新更新