为 CentOS 7 构建 OpenGL SuperBible 7,缺少 glfw3
Building OpenGL SuperBible 7 for CentOS 7, missing glfw3
问题
我正在使用 CentOS 7 并一直在尝试更正构建说明的问题,尤其是在尝试查找 glfw 库时。按照 HOWTOBUILD.txt 文件(可从 SB7 git 存储库获得)的说明,当 运行 make
时,我经常收到错误消息命令:
[sweet_ass_user_name@bitchin_camaro build]$ make
Scanning dependencies of target sb7
[ 1%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7.cpp.o
[ 1%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7color.cpp.o
[ 2%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7ktx.cpp.o
[ 2%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7object.cpp.o
/usr/local/opengl/SDK_Sandbox/sb7code/src/sb7/sb7object.cpp: In member function ‘void sb7::object::render_sub_object(unsigned int, unsigned int, unsigned int)’:
/usr/local/opengl/SDK_Sandbox/sb7code/src/sb7/sb7object.cpp:212:77: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
(void*)sub_object[object_index].first,
^
[ 3%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7shader.cpp.o
[ 4%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7textoverlay.cpp.o
[ 4%] Building C object CMakeFiles/sb7.dir/src/sb7/gl3w.c.o
[ 5%] Linking CXX static library lib/libsb7.a
[ 5%] Built target sb7
Scanning dependencies of target wrapmodes
[ 6%] Building CXX object CMakeFiles/wrapmodes.dir/src/wrapmodes/wrapmodes.cpp.o
[ 7%] Linking CXX executable ../bin/wrapmodes
/usr/bin/ld: cannot find -lglfw3
collect2: error: ld returned 1 exit status
make[2]: *** [../bin/wrapmodes] Error 1
make[1]: *** [CMakeFiles/wrapmodes.dir/all] Error 2
make: *** [all] Error 2
为了让事情更混乱,我已经安装了这些包:
- glfw
- glfw-devel
当检查我安装的 glfw 包时,rpm -qa | grep glfw
,我的系统 returns:
glfw-3.2.1-2.el7.x86_64
glfw-devel-3.2.1-2.el7.x86_64
很明显,安装的 glfw 库是 glfw
库的第 3 版。
可是,为什么系统不识别?
背景和系统信息
OS: centos-release-7-5.1804.4.el7.centos.x86_64
OpenGL: 4.6.0 NVIDIA 396.37
GPU: GV100
Optix: 5.1
CUDA: 9.2
CMake: cmake3, cmake3-gui
OpenGL libraries:
mesa-libGLU-9.0.0-4.el7.x86_64
mesa-libGLES-17.2.3-8.20171019.el7.x86_64
mesa-libGLU-devel-9.0.0-4.el7.x86_64
mesa-libwayland-egl-17.2.3-8.20171019.el7.x86_64
mesa-libGL-17.2.3-8.20171019.el7.x86_64
mesa-filesystem-17.2.3-8.20171019.el7.x86_64
mesa-libEGL-17.2.3-8.20171019.el7.x86_64
mesa-dri-drivers-17.2.3-8.20171019.el7.x86_64
mesa-libglapi-17.2.3-8.20171019.el7.x86_64
mesa-libxatracker-17.2.3-8.20171019.el7.x86_64
mesa-libGL-devel-17.2.3-8.20171019.el7.x86_64
mesa-libgbm-17.2.3-8.20171019.el7.x86_64
Graphics Misc Libs:
libX11-common-1.6.5-1.el7.noarch
libX11-1.6.5-1.el7.x86_64
libX11-devel-1.6.5-1.el7.x86_64
libXinerama-1.1.3-2.1.el7.x86_64
libXinerama-devel-1.1.3-2.1.el7.x86_64
glfw-3.2.1-2.el7.x86_64
glfw-devel-3.2.1-2.el7.x86_64
链接
答案
事实证明,由于有关 glfw 包 和 glfw 版本 之间差异的命名问题令人困惑,答案很简单修改 CMakeLists.txt
文件(link 此处:SB7 CMakeLists.txt)
第 28 行需要删除一个字符。将 glfw3 更改为 glfw.
但是!!
也不要重命名上面那行的 glfw3 名称。我只能假设这是指 glfw3 的版本,而不是包的名称。
现在,代码构建和所有构建 运行 都很好。
补充说明
对于 centos7 系统,为了使用 CUDA 的当前构建规则,您需要 运行 cmake3 ..
(而不是 cmake
)
固定代码
cmake_minimum_required (VERSION 2.6)
project (superbible7)
LINK_DIRECTORIES( ${CMAKE_SOURCE_DIR}/lib )
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
# Second, for multi-config builds (e.g. msvc)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
find_package(OpenGL)
set (CMAKE_DEBUG_POSTFIX "_d")
if(WIN32)
set(COMMON_LIBS sb7 optimized glfw3 debug glfw3_d ${GLFW_LIBRARIES} ${OPENGL_LIBRARIES})
elseif (UNIX)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GLFW REQUIRED glfw3)
set(COMMON_LIBS sb7 glfw X11 Xrandr Xinerama Xi Xxf86vm Xcursor GL rt dl)
else()
set(COMMON_LIBS sb7)
endif()
问题
我正在使用 CentOS 7 并一直在尝试更正构建说明的问题,尤其是在尝试查找 glfw 库时。按照 HOWTOBUILD.txt 文件(可从 SB7 git 存储库获得)的说明,当 运行 make
时,我经常收到错误消息命令:
[sweet_ass_user_name@bitchin_camaro build]$ make
Scanning dependencies of target sb7
[ 1%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7.cpp.o
[ 1%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7color.cpp.o
[ 2%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7ktx.cpp.o
[ 2%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7object.cpp.o
/usr/local/opengl/SDK_Sandbox/sb7code/src/sb7/sb7object.cpp: In member function ‘void sb7::object::render_sub_object(unsigned int, unsigned int, unsigned int)’:
/usr/local/opengl/SDK_Sandbox/sb7code/src/sb7/sb7object.cpp:212:77: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
(void*)sub_object[object_index].first,
^
[ 3%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7shader.cpp.o
[ 4%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7textoverlay.cpp.o
[ 4%] Building C object CMakeFiles/sb7.dir/src/sb7/gl3w.c.o
[ 5%] Linking CXX static library lib/libsb7.a
[ 5%] Built target sb7
Scanning dependencies of target wrapmodes
[ 6%] Building CXX object CMakeFiles/wrapmodes.dir/src/wrapmodes/wrapmodes.cpp.o
[ 7%] Linking CXX executable ../bin/wrapmodes
/usr/bin/ld: cannot find -lglfw3
collect2: error: ld returned 1 exit status
make[2]: *** [../bin/wrapmodes] Error 1
make[1]: *** [CMakeFiles/wrapmodes.dir/all] Error 2
make: *** [all] Error 2
为了让事情更混乱,我已经安装了这些包:
- glfw
- glfw-devel
当检查我安装的 glfw 包时,rpm -qa | grep glfw
,我的系统 returns:
glfw-3.2.1-2.el7.x86_64
glfw-devel-3.2.1-2.el7.x86_64
很明显,安装的 glfw 库是 glfw
库的第 3 版。
可是,为什么系统不识别?
背景和系统信息
OS: centos-release-7-5.1804.4.el7.centos.x86_64
OpenGL: 4.6.0 NVIDIA 396.37
GPU: GV100
Optix: 5.1
CUDA: 9.2
CMake: cmake3, cmake3-gui
OpenGL libraries:
mesa-libGLU-9.0.0-4.el7.x86_64
mesa-libGLES-17.2.3-8.20171019.el7.x86_64
mesa-libGLU-devel-9.0.0-4.el7.x86_64
mesa-libwayland-egl-17.2.3-8.20171019.el7.x86_64
mesa-libGL-17.2.3-8.20171019.el7.x86_64
mesa-filesystem-17.2.3-8.20171019.el7.x86_64
mesa-libEGL-17.2.3-8.20171019.el7.x86_64
mesa-dri-drivers-17.2.3-8.20171019.el7.x86_64
mesa-libglapi-17.2.3-8.20171019.el7.x86_64
mesa-libxatracker-17.2.3-8.20171019.el7.x86_64
mesa-libGL-devel-17.2.3-8.20171019.el7.x86_64
mesa-libgbm-17.2.3-8.20171019.el7.x86_64
Graphics Misc Libs:
libX11-common-1.6.5-1.el7.noarch
libX11-1.6.5-1.el7.x86_64
libX11-devel-1.6.5-1.el7.x86_64
libXinerama-1.1.3-2.1.el7.x86_64
libXinerama-devel-1.1.3-2.1.el7.x86_64
glfw-3.2.1-2.el7.x86_64
glfw-devel-3.2.1-2.el7.x86_64
链接
答案
事实证明,由于有关 glfw 包 和 glfw 版本 之间差异的命名问题令人困惑,答案很简单修改 CMakeLists.txt
文件(link 此处:SB7 CMakeLists.txt)
第 28 行需要删除一个字符。将 glfw3 更改为 glfw.
但是!!
也不要重命名上面那行的 glfw3 名称。我只能假设这是指 glfw3 的版本,而不是包的名称。
现在,代码构建和所有构建 运行 都很好。
补充说明
对于 centos7 系统,为了使用 CUDA 的当前构建规则,您需要 运行 cmake3 ..
(而不是 cmake
)
固定代码
cmake_minimum_required (VERSION 2.6)
project (superbible7)
LINK_DIRECTORIES( ${CMAKE_SOURCE_DIR}/lib )
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
# Second, for multi-config builds (e.g. msvc)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
find_package(OpenGL)
set (CMAKE_DEBUG_POSTFIX "_d")
if(WIN32)
set(COMMON_LIBS sb7 optimized glfw3 debug glfw3_d ${GLFW_LIBRARIES} ${OPENGL_LIBRARIES})
elseif (UNIX)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GLFW REQUIRED glfw3)
set(COMMON_LIBS sb7 glfw X11 Xrandr Xinerama Xi Xxf86vm Xcursor GL rt dl)
else()
set(COMMON_LIBS sb7)
endif()