glfw3库在带有cmake的clion中导致macOS上的不确定符号

GLFW3 library in CLion with CMake causes undefined symbols on MacOS

本文关键字:macOS 符号 不确定 clion cmake glfw3      更新时间:2023-10-16

i使用cmake从MacOS中的源构建了GLFW,一切顺利,示例正常。但是,当我试图使用clion中的cmake编译程序时,我会收到以下错误:

Scanning dependencies of target triangle
[ 50%] Building CXX object CMakeFiles/triangle.dir/main.cpp.o
[100%] Linking CXX executable triangle
Undefined symbols for architecture x86_64:
  "_CFArrayAppendValue", referenced from:
    __glfwInitJoysticksNS in libglfw3.a(cocoa_joystick.m.o)
    _matchCallback in libglfw3.a(cocoa_joystick.m.o)
  "_CFArrayCreateMutable", referenced from:
    __glfwInitJoysticksNS in libglfw3.a(cocoa_joystick.m.o)
    _matchCallback in libglfw3.a(cocoa_joystick.m.o)
... (There are a huge bunch of errors like this, let me know if you want to read all of them)
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]: *** [triangle] Error 1
make[2]: *** [CMakeFiles/triangle.dir/all] Error 2
make[1]: *** [CMakeFiles/triangle.dir/rule] Error 2
make: *** [triangle] Error 2

我浏览了互联网和文档,发现我应该用框架参数进行编译,例如:

cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo

我在命令行上尝试了它,它起作用了。但是,如果我想在Clion(或Cmake)中完成事情,或者如何在CMAKE中使用框架?

我的cmakelists.txt如果您想知道:

cmake_minimum_required(VERSION 3.8)
project(triangle)
set(CMAKE_CXX_STANDARD 11)
find_package(glfw3 REQUIRED)
set(SOURCE_FILES main.cpp)
add_executable(triangle ${SOURCE_FILES})
target_link_libraries(triangle glfw3)

我将其添加到我的cmakelists.txt,现在起作用:

set(CMAKE_CXX_FLAGS "-framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo")

所以我的cmakelists.txt看起来像这样:

cmake_minimum_required(VERSION 3.8)
project(triangle)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "-framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo")
find_package(glfw3 REQUIRED)
set(SOURCE_FILES main.cpp)
add_executable(triangle ${SOURCE_FILES})
target_link_libraries(triangle glfw3)

我希望有一种更加"优雅"的方式,但是现在可以解决我的问题。