如何使用 cmake link 对抗 OSX 上的 libGL?

How to link against libGL on OSX using cmake?

我正在尝试在 OSX 10.11 上编译 camera_calibration,在遇到一些与 X11 相关的依赖项的障碍后,我发现自己仍然遇到一些链接错误:

Undefined symbols for architecture x86_64:
  "_glXChooseVisual", referenced from:
      vis::OpenGLContextGLX::InitializeWindowless(vis::OpenGLContextImpl*) in opengl_context_glx.cc.o
  "_glXCreateContext", referenced from:
      vis::OpenGLContextGLX::InitializeWindowless(vis::OpenGLContextImpl*) in opengl_context_glx.cc.o
  "_glXDestroyContext", referenced from:
      vis::OpenGLContextGLX::Deinitialize() in opengl_context_glx.cc.o
  "_glXGetCurrentContext", referenced from:
      vis::IsOpenGLContextAvailable() in opengl.cc.o
      vis::OpenGLContextGLX::AttachToCurrent() in opengl_context_glx.cc.o
  "_glXGetCurrentDisplay", referenced from:
      vis::OpenGLContextGLX::AttachToCurrent() in opengl_context_glx.cc.o
  "_glXGetCurrentDrawable", referenced from:
      vis::OpenGLContextGLX::AttachToCurrent() in opengl_context_glx.cc.o
  "_glXMakeCurrent", referenced from:
      vis::OpenGLContextGLX::MakeCurrent() in opengl_context_glx.cc.o
ld: symbol(s) not found for architecture x86_64

我发现 libGL.dylib 有这些符号:

for lib in /usr/X11R6/lib/*.dylib;do nm -gU $lib | grep _glXChooseVisual;done
000000000000307f T _glXChooseVisual
000000000000307f T _glXChooseVisual
gp:src George$ for lib in /usr/X11R6/lib/*.dylib;do echo $lib && nm -gU $lib | grep _glXChooseVisual;done
/usr/X11R6/lib/libAppleWM.7.dylib
/usr/X11R6/lib/libAppleWM.dylib
/usr/X11R6/lib/libFS.6.dylib
/usr/X11R6/lib/libFS.dylib
/usr/X11R6/lib/libGL.1.dylib
000000000000307f T _glXChooseVisual
/usr/X11R6/lib/libGL.dylib
000000000000307f T _glXChooseVisual

但是我似乎无法调整 CMakeLists.txt 来考虑到这一点。

我试过添加:

set(X11R6_INCLUDE_DIRS "/usr/X11R6/include")
set(X11R6_LIBRARIES "/usr/X11R6/lib")

我稍后在为 libvis 调用 target_include_directoriestarget_link_libraries 时使用它,但似乎没有成功。

Hackily 在 target_link_libraries 中添加 -lGL 结果是 ld: library not found for -lGL

我也看过 CMake's FindOpenGL reference 并尝试使用 find_package(OpenGL REQUIRED COMPONENTS OpenGL GLX) 但没走多远:

CMake Error at /usr/local/Cellar/cmake/3.18.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
  Could NOT find OpenGL (missing: GLX)

关于在 OSX 上通过 CMake 正确链接 GLX 的任何提示?

在 macOS 上 不要 (!) 针对 X11 / GLX 开发。 它们不受本机支持! macOS 的 X11 服务器仅支持功能有限的间接 GLX。您只会获得低于标准的性能。不支持 CUDA(libvis 使用)

在 macOS 上,所有 OpenGL 开发都应使用本机 OpenGL 框架:https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_contexts/opengl_contexts.html

但是请注意,Apple 已宣布弃用 OpenGL。

简而言之:您至少必须修改您的程序才能使用 macOS OpenGL 框架,或者甚至硬着头皮接受 macOS 不是您的应用程序受良好支持的平台。