如何使用 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_directories
和 target_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 不是您的应用程序受良好支持的平台。
我正在尝试在 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_directories
和 target_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 不是您的应用程序受良好支持的平台。