由于架构 x86_64 的未定义符号,GLFW 的最小示例失败

des*_*esa 2 c++ opengl macos cmake clion

我正在尝试编译以下最小示例GLFW

#include <GLFW/glfw3.h>
#include <thread>

int main() {
    glfwInit();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    glfwTerminate();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的CMakeLists.txt文件是:

cmake_minimum_required(VERSION 3.9)
project(viewer)

set(CMAKE_CXX_STANDARD 11)

find_package(glfw3 3.2 REQUIRED)
include_directories(${GLFW_INCLUDE_DIRS})

add_executable(viewer main.cpp)

target_link_libraries(viewer ${GLFW_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

如果我尝试编译代码,它会失败并显示以下错误消息:

[ 50%] Linking CXX executable visualiser
Undefined symbols for architecture x86_64:
  "_glfwInit", referenced from:
      _main in main.cpp.o
  "_glfwTerminate", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [visualiser] Error 1
make[2]: *** [CMakeFiles/visualiser.dir/all] Error 2
make[1]: *** [CMakeFiles/visualiser.dir/rule] Error 2
make: *** [visualiser] Error 2
Run Code Online (Sandbox Code Playgroud)

我看到类似的问题,例如:

但他们的解决方案并没有真正帮助。

UPD:按照@thomas_f 的评论,我修改了我的CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 3.9)
project(viewer)

set(CMAKE_CXX_STANDARD 11)

find_package(glfw3 3.2 REQUIRED)
include_directories(${GLFW3_INCLUDE_DIR})

add_executable(viewer main.cpp)

target_link_libraries(viewer ${GLFW3_LIBRARY})
message(GLFW LIB: ${GLFW3_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

我还确保CMakeCache.txt我的构建目录中没有:

$ ls -a
.                 ..                .idea             CMakeLists.txt    cmake-build-debug main.cpp
Run Code Online (Sandbox Code Playgroud)

但是,我仍然收到相同的错误消息。看起来

/Applications/CLion.app/Contents/bin/cmake/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" ........./viewer
GLFWLIB:
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/denis/Documents/projects/theia/code/visualiser/cmake-build-debug

[Finished]
Run Code Online (Sandbox Code Playgroud)

所以似乎${GLFW3_LIBRARY}没有定义。

tho*_*s_f 5

来自glfw3Config.cmake

# - Config file for the glfw3 package
# It defines the following variables
#   GLFW3_INCLUDE_DIR, the path where GLFW headers are located
#   GLFW3_LIBRARY_DIR, folder in which the GLFW library is located
#   GLFW3_LIBRARY, library to link against to use GLFW
Run Code Online (Sandbox Code Playgroud)

您似乎引用了错误的变量。此外,include_directories()在这种情况下不需要调用,因为 GLFW 显然安装在标准位置,即您的编译器已经知道在哪里可以找到它。

编辑:我能够重现链接器错误并更改变量名称以GLFW3_LIBRARY修复它。

说明:将您的链接命令更改为:target_link_libraries(viewer ${GLFW3_LIBRARY})

更新,如果你在Mac OS:如果您遇到相同的问题OP,这可能是因为glfw3Config.cmake没有导出我的回答中提到的变量。相反,它会创建一个导入的库,glfw. 在这种情况下,正确的方法来链接glfw是简单地做到这一点:target_link_libraries(<target> glfw)

如果glfw是使用 安装的brew,您应该在以下.cmake位置找到-files:/usr/local/Cellar/glfw/<version>/lib/cmake/glfw3