如何 link 使用 GLFW 作为 cmake 中的外部项目的正确库?
How to link the right libraries with GLFW as an external project in cmake?
我像这样包括 glfw:
ExternalProject_Add(glfw-external
URL https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/glfw
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/install
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
add_dependencies(ShittyLife glfw-external)
if(UNIX)
set(GLFW_LIB <What to put here?> libglfw3.a)
else()
set(GLFW_LIB ${install_dir}/lib/glfw3.lib)
endif()
稍后使用 GLFW_LIB 变量链接这些库。
它在 windows 上运行良好,但在 Linux 上我缺少一些库。 glfw 网页对此有解决方案,但其中 none 似乎与 ExternalProject_add.
的方式兼容
关于我如何找出所需库的任何想法,最好是能够跨不同 machines/distros 工作的方式?
如果这对我有帮助,这是我在尝试构建时遇到的错误:
相关位:
/usr/bin/ld: /home/molion/Desktop/ShittyLife/build/install/lib/libglfw3.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
全部:
[ 94%] Building CXX object CMakeFiles/ShittyLife.dir/src/main.cpp.o
[100%] Linking CXX executable ShittyLife
/usr/bin/ld: /home/molion/Desktop/ShittyLife/build/install/lib/libglfw3.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/ShittyLife.dir/build.make:95: recipe for target 'ShittyLife' failed
make[2]: *** [ShittyLife] Error 1
CMakeFiles/Makefile2:68: recipe for target 'CMakeFiles/ShittyLife.dir/all' failed
make[1]: *** [CMakeFiles/ShittyLife.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
GLFW 提供了一个 CMake 配置文件包,因此您应该使用 find_package
来找到它。
但是由于这仅在 ExternalProject_Add
之后才可用 运行 而不是在配置时,您必须创建一个超级项目并将您自己的项目也添加为 ExternalProject,如下所示:
ExternalProject_Add(glfw-test
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src
PREFIX ${CMAKE_CURRENT_BINARY_DIR}
INSTALL_COMMAND ""
CMAKE_CACHE_ARGS "-DCMAKE_PREFIX_PATH:STRING=${GLFW_INSTALL_PREFIX}/lib/cmake"
DEPENDS glfw-external
)
与 set(GLFW_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/glfw_install")
和 GLFW_INSTALL_PREFIX
也用于 GLFW ExternalProject_Add
。
然后您可以使用
find_package(glfw3 REQUIRED)
find_package(OpenGL REQUIRED)
和
target_link_libraries(${PROJECT_NAME}
glfw
OpenGL::GL
)
在你的项目中。
除了使用 ExternalProject
,您还可以关注 the GLFW suggestion。
如果您愿意使用包管理器来处理依赖项,您可以考虑使用 Hunter 将 GLFW 添加到您的项目中。 Hunter 是用原生 CMake 编写的,并且已经在底层使用了 ExternalProject。然而,使用 imo 更容易。
有一个短的(稀疏的)documentation page。基本上你的 CMakeLists.txt 看起来像下面这样...
# CMake version 3.0 or higher is required for the Hunter package manager.
cmake_minimum_required(VERSION 3.0)
# Include the Hunter package manager module.
include("cmake/HunterGate.cmake")
# Ensure a reproducible build by locking down the Hunter package versions.
HunterGate(
URL "https://github.com/ruslo/hunter/archive/v0.19.77.tar.gz"
SHA1 "8898dd07756c408c63c63add903c8600c4cf4c0e")
# Your project name here.
project(my_project_name)
# Tell Hunter which packages to pull in for our project.
hunter_add_package(glfw)
find_package(glfw3 REQUIRED)
# Link against your target.
target_link_libraries(my_target_name glfw)
在每个新 Hunter release. I recently published a codecast on Hunter 中都可以找到神奇的 HunterGate
行,如果您迷路了,它会帮助您完成这些步骤。
这是我使用了一段时间的 CMakeLists.txt
之一。非常简单,您告诉 CMake glfw3
的位置,以便它的 CMake 可以完成它的工作,然后将 glfw
添加为 link 库并为其提供 include 目录。这与在 visual studio.
中包含 GLFW
没有太大区别
cmake_minimum_required(VERSION 3.7)
project(SkyGames)
set(CMAKE_CXX_STANDARD 14)
set(SOURCE_FILES main.cpp)
add_executable(SkyGames ${SOURCE_FILES})
###########################
# GLFW
###########################
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(${PROJECT_SOURCE_DIR}/Externals/GLFW3)
target_link_libraries(SkyGames glfw)
include_directories(SkyGames ${GLFW_INCLUDE_DIR})
###########################
# GLEW
###########################
add_definitions(-DGLEW_STATIC)
set(GLEW_ROOT_DIR ${PROJECT_SOURCE_DIR}/Externals/glew2s)
set(GLEW_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/Externals/glew2s/include)
set(GLEW_LIBRARY ${PROJECT_SOURCE_DIR}/Externals/glew2s/lib/Release/Win32/glew32s.lib)
find_package(GLEW REQUIRED)
include_directories(${GLEW_INCLUDE_DIR})
##########################
# OPENGL
##########################
find_package(OpenGL REQUIRED)
target_link_libraries(SkyGames ${GLEW_LIBRARY} ${OPENGL_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY})
我像这样包括 glfw:
ExternalProject_Add(glfw-external
URL https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/glfw
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/install
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
add_dependencies(ShittyLife glfw-external)
if(UNIX)
set(GLFW_LIB <What to put here?> libglfw3.a)
else()
set(GLFW_LIB ${install_dir}/lib/glfw3.lib)
endif()
稍后使用 GLFW_LIB 变量链接这些库。
它在 windows 上运行良好,但在 Linux 上我缺少一些库。 glfw 网页对此有解决方案,但其中 none 似乎与 ExternalProject_add.
的方式兼容关于我如何找出所需库的任何想法,最好是能够跨不同 machines/distros 工作的方式?
如果这对我有帮助,这是我在尝试构建时遇到的错误:
相关位:
/usr/bin/ld: /home/molion/Desktop/ShittyLife/build/install/lib/libglfw3.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
全部:
[ 94%] Building CXX object CMakeFiles/ShittyLife.dir/src/main.cpp.o
[100%] Linking CXX executable ShittyLife
/usr/bin/ld: /home/molion/Desktop/ShittyLife/build/install/lib/libglfw3.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/ShittyLife.dir/build.make:95: recipe for target 'ShittyLife' failed
make[2]: *** [ShittyLife] Error 1
CMakeFiles/Makefile2:68: recipe for target 'CMakeFiles/ShittyLife.dir/all' failed
make[1]: *** [CMakeFiles/ShittyLife.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
GLFW 提供了一个 CMake 配置文件包,因此您应该使用 find_package
来找到它。
但是由于这仅在 ExternalProject_Add
之后才可用 运行 而不是在配置时,您必须创建一个超级项目并将您自己的项目也添加为 ExternalProject,如下所示:
ExternalProject_Add(glfw-test
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src
PREFIX ${CMAKE_CURRENT_BINARY_DIR}
INSTALL_COMMAND ""
CMAKE_CACHE_ARGS "-DCMAKE_PREFIX_PATH:STRING=${GLFW_INSTALL_PREFIX}/lib/cmake"
DEPENDS glfw-external
)
与 set(GLFW_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/glfw_install")
和 GLFW_INSTALL_PREFIX
也用于 GLFW ExternalProject_Add
。
然后您可以使用
find_package(glfw3 REQUIRED)
find_package(OpenGL REQUIRED)
和
target_link_libraries(${PROJECT_NAME}
glfw
OpenGL::GL
)
在你的项目中。
除了使用 ExternalProject
,您还可以关注 the GLFW suggestion。
如果您愿意使用包管理器来处理依赖项,您可以考虑使用 Hunter 将 GLFW 添加到您的项目中。 Hunter 是用原生 CMake 编写的,并且已经在底层使用了 ExternalProject。然而,使用 imo 更容易。
有一个短的(稀疏的)documentation page。基本上你的 CMakeLists.txt 看起来像下面这样...
# CMake version 3.0 or higher is required for the Hunter package manager.
cmake_minimum_required(VERSION 3.0)
# Include the Hunter package manager module.
include("cmake/HunterGate.cmake")
# Ensure a reproducible build by locking down the Hunter package versions.
HunterGate(
URL "https://github.com/ruslo/hunter/archive/v0.19.77.tar.gz"
SHA1 "8898dd07756c408c63c63add903c8600c4cf4c0e")
# Your project name here.
project(my_project_name)
# Tell Hunter which packages to pull in for our project.
hunter_add_package(glfw)
find_package(glfw3 REQUIRED)
# Link against your target.
target_link_libraries(my_target_name glfw)
在每个新 Hunter release. I recently published a codecast on Hunter 中都可以找到神奇的 HunterGate
行,如果您迷路了,它会帮助您完成这些步骤。
这是我使用了一段时间的 CMakeLists.txt
之一。非常简单,您告诉 CMake glfw3
的位置,以便它的 CMake 可以完成它的工作,然后将 glfw
添加为 link 库并为其提供 include 目录。这与在 visual studio.
GLFW
没有太大区别
cmake_minimum_required(VERSION 3.7)
project(SkyGames)
set(CMAKE_CXX_STANDARD 14)
set(SOURCE_FILES main.cpp)
add_executable(SkyGames ${SOURCE_FILES})
###########################
# GLFW
###########################
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(${PROJECT_SOURCE_DIR}/Externals/GLFW3)
target_link_libraries(SkyGames glfw)
include_directories(SkyGames ${GLFW_INCLUDE_DIR})
###########################
# GLEW
###########################
add_definitions(-DGLEW_STATIC)
set(GLEW_ROOT_DIR ${PROJECT_SOURCE_DIR}/Externals/glew2s)
set(GLEW_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/Externals/glew2s/include)
set(GLEW_LIBRARY ${PROJECT_SOURCE_DIR}/Externals/glew2s/lib/Release/Win32/glew32s.lib)
find_package(GLEW REQUIRED)
include_directories(${GLEW_INCLUDE_DIR})
##########################
# OPENGL
##########################
find_package(OpenGL REQUIRED)
target_link_libraries(SkyGames ${GLEW_LIBRARY} ${OPENGL_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY})