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

10
我正在尝试使用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没有正确设置造成的。

2个回答

13

我不确定如何使用pkgconfig找到GLFW,但我认为在这种情况下您不需要pkgconfig。因为GLFW本身是使用CMake构建的,所以它应该安装一个本地的CMake配置模块,而它确实安装了。

好吧,差不多了。截至v3.1.2,官方GLFW CMake配置模块支持有点有bug。相反,使用shaxbee的分支adasworks分支(基于shaxbee的但更新)

有了那个GLFW,你只需要找到它的两行代码:

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。 - saurabheights

0

自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 环境变量指定其他搜索目录。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接