c++ - 如何将正确的库与 GLFW 链接为 cmake 中的外部项目?

标签 c++ cmake glfw

我像这样包括 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 网页对此有解决方案,但似乎没有一个与 ExternalProject_add 兼容。

关于如何确定所需的库是什么的任何想法,最好是以一种可以跨不同机器/发行版工作的方式?

如果它有帮助,这是我在尝试构建时遇到的错误:

相关位:

/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 运行后可用,而不是在配置时可用,因此您必须创建一个 super 项目并将您自己的项目也添加为 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 也用于 GLFWs ExternalProject_Add

然后你可以使用

find_package(glfw3 REQUIRED)
find_package(OpenGL REQUIRED)

target_link_libraries(${PROJECT_NAME}
    glfw
    OpenGL::GL 
)

在你的项目中。


除了使用 ExternalProject,您还可以关注 the GLFW suggestion .

关于c++ - 如何将正确的库与 GLFW 链接为 cmake 中的外部项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46659496/

相关文章:

c++ - 在 C++ 中实现 GLFW Windows 时“无法实例化抽象类”

C++ 初始化静态数组

c++ - Vb.net 和 C++ 的 MATH 函数中任何已知的歧义

c++ - Eclipse cdt : Includes header file correct, 编译,但突出显示源代码: "Unresolved inclusion"

cmake - 多个子项目依赖于同一个库

build - 如何检测 CMake 中的 sse 可用性

c++ - OpenGL:无法渲染三角形

opengl - 为什么这个 OpenGL 程序不绘制三角形?

c++ - 如何在xcode中链接glew

cmake - 如何表示映射文件依赖于 add_executable?