使用 CMAKE 构建 GLFW3 应用程序 - GLFW LIBRARIES 未设置

Posted

技术标签:

【中文标题】使用 CMAKE 构建 GLFW3 应用程序 - GLFW LIBRARIES 未设置【英文标题】:Building GLFW3 Application with CMAKE - GLFW_LIBRARIES doesnt set 【发布时间】:2016-03-25 20:37:50 【问题描述】:

我正在尝试使用 glfw3 构建一个小项目,但无论我做什么,我都无法让 pkgconfig 设置 GLFW_LIBRARIES。

这是我的 CMakeList.txt

cmake_minimum_required(VERSION 3.3)
project(LearnGLSL)

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11")

if (CMAKE_BUILD_TYPE STREQUAL "")
    set(CMAKE_BUILD_TYPE Debug)
endif()


if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "$CMAKE_SOURCE_DIR/build/debug")
    set(PROJECT_BINARY_DIR "$CMAKE_SOURCE_DIR/build/debug")
endif(CMAKE_BUILD_TYPE STREQUAL "Debug")


file(MAKE_DIRECTORY $PROJECT_BINARY_DIR)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $PROJECT_BINARY_DIR)


find_package(OpenGL REQUIRED)

find_package(PkgConfig REQUIRED)
pkg_check_modules(GLFW REQUIRED glfw3)



include_directories(
        $OPENGL_INCLUDE_DIR
        $GLFW_INCLUDE_DIRS
)


set(SOURCE_FILES main.cpp gl_core_4_3.cpp)

message(WARNING "$GLFW_LIBRARIES")

add_executable(LearnGLSL $SOURCE_FILES)
target_link_libraries(LearnGLSL $OPENGL_gl_LIBRARY $GLFW_LIBRARIES)


add_custom_command(TARGET LearnGLSL  POST_BUILD
        COMMAND $CMAKE_COMMAND -E copy_directory
        $CMAKE_SOURCE_DIR/assets
        $PROJECT_BINARY_DIR
        COMMENT "Copy resources to build tree")

这里是glfw3的安装位置

-- Installing: /usr/local/include/GLFW
-- Installing: /usr/local/include/GLFW/glfw3native.h
-- Installing: /usr/local/include/GLFW/glfw3.h
-- Installing: /usr/local/lib/cmake/glfw/glfw3Config.cmake
-- Installing: /usr/local/lib/cmake/glfw/glfw3ConfigVersion.cmake
-- Installing: /usr/local/lib/cmake/glfw/glfwTargets.cmake
-- Installing: /usr/local/lib/cmake/glfw/glfwTargets-noconfig.cmake
-- Installing: /usr/local/lib/pkgconfig/glfw3.pc
-- Installing: /usr/local/lib/libglfw3.a

我将是第一个承认我对 CMAKE 不太满意的人,但这似乎很简单,而且我已经尽我所能在谷歌上找到了。也许它是我没有注意到的错字。任何帮助表示感谢谢谢

哦,我忘了提到我在构建这个项目时得到了对 glfw 函数的未定义引用。我认为这是 GLFW_LIBRARIES 没有正确设置的结果。

【问题讨论】:

【参考方案1】:

我不知道如何使用 pkgconfig 找到 GLFW,但我认为在这种情况下您不需要 pkgconfig。由于 GLFW 本身是使用 CMake 构建的,因此它应该安装一个本机 CMake 配置模块。

嗯,差不多。从 v3.1.2 开始,官方 GLFW CMake 配置模块支持有点问题。相反,请使用 shaxbee's fork 或 adasworks fork(基于 shaxbee 但更新)

使用 GLFW,您只需找到 2 行代码:

find_package(glfw3 REQUIRED)
...
target_link_libraries(LearnGLSL ... glfw)

我还在你的 CMakeLists.txt 中发现了一些其他问题,所以我重复整个脚本,修改:

cmake_minimum_required(VERSION 3.3)
project(LearnGLSL)

set(CMAKE_CXX_STANDARD 11) # no explicit compiler flags if possible

# don't read CMAKE_BUILD_TYPE, it has no meaning with multiconfig
# generators
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "$CMAKE_SOURCE_DIR/build/debug")

# PROJECT_BINARY_DIR should not be set at all
# You establish the BINARY_DIR with the initial cmake command
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $PROJECT_BINARY_DIR)

find_package(OpenGL REQUIRED)
find_package(glfw3 REQUIRED)

include_directories($OPENGL_INCLUDE_DIR)

add_executable(LearnGLSL main.cpp gl_core_4_3.cpp)
target_link_libraries(LearnGLSL $OPENGL_gl_LIBRARY glfw)

add_custom_command(TARGET LearnGLSL POST_BUILD
    COMMAND $CMAKE_COMMAND -E copy_directory
    $CMAKE_SOURCE_DIR/assets
    $PROJECT_BINARY_DIR
    COMMENT "Copy resources to build tree")

【讨论】:

对于目标链接库,可以使用 $GLFW3_LIBRARY 代替 glfw。【参考方案2】:

由于 CMake 3.1 pkg_check_modules 使用来自 CMAKE_PREFIX_PATH 变量的附加路径来搜索 .pc 文件。搜索的执行方式与命令find_library 中的类似,但在结果路径中添加了额外的子目录pkgconfig/。具体来说,对于CMAKE_PREFIX_PATH中的每个<prefix>,在下一个目录中搜索.pc文件:

<prefix>/lib[64]/[<arch>/]pkgconfig

(适当时添加后缀64 和特定于架构的子目录)。

所以有了文件/usr/local/lib/pkgconfig/glfw3.pc,您需要将CMAKE_PREFIX_PATH 设置为/usr/local,以便pkg_check_modules 能够找到它。变量可以设置:

1) 在CMakeLists.txt 脚本本身中,或

2) 在命令行中

cmake -DCMAKE_PREFIX_PATH=<...> <source-dir>

3) 作为环境一(取决于操作系统)。


在 CMake 3.1 之前(和之后)可以通过 PKG_CONFIG_PATH environment 变量指定额外的搜索目录。

例如文件/usr/local/lib/pkgconfig/glfw3.pc 变量PKG_CONFIG_PATH 应该包含/usr/local/lib/pkgconfig

【讨论】:

以上是关于使用 CMAKE 构建 GLFW3 应用程序 - GLFW LIBRARIES 未设置的主要内容,如果未能解决你的问题,请参考以下文章

VS2017 配置glfw3

使用 CMake 在 Mac 上链接静态 GLFW 和 OpenGL

在 Mac 上使用 CMake 的 GLFW

制作 | UWP :: 使用 Cmake 构建通用 Windows 应用程序

在 linux 下使用 CMake 构建应用程序

在 linux 下使用 CMake 构建应用程序