为 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 包时,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()