【问题标题】:How to correctly setup cmake for glfw on clion on MacOS如何在 MacOS 上的 clion 上为 glfw 正确设置 cmake
【发布时间】:2020-08-28 05:50:24
【问题描述】:

我最近买了一台 Macbook,我想开始为一个项目编写一些 OpenGL 代码。

规格

  • MacOS
  • Macbook pro 16 英寸 2019
  • 克利翁
  • glfw3(预编译的 64 位二进制文​​件)

CMake 没有抱怨,但是一旦我开始编译,我就会收到以下错误

    /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/arnesix/Documents/dev/c++/graphics/cmake-build-debug --target graphics -- -j 12
[ 50%] Linking CXX executable graphics
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)
  "_CFArrayGetCount", referenced from:
      __glfwSetVideoModeNS in libglfw3.a(cocoa_monitor.m.o)
      __glfwPlatformGetVideoModes in libglfw3.a(cocoa_monitor.m.o)
      _matchCallback in libglfw3.a(cocoa_joystick.m.o)
      _closeJoystick in libglfw3.a(cocoa_joystick.m.o)
      __glfwPlatformPollJoystick in libglfw3.a(cocoa_joystick.m.o)
  "_CFArrayGetValueAtIndex", referenced from:
      __glfwSetVideoModeNS in libglfw3.a(cocoa_monitor.m.o)
      __glfwPlatformGetVideoModes in libglfw3.a(cocoa_monitor.m.o)
      _matchCallback in libglfw3.a(cocoa_joystick.m.o)
      _closeJoystick in libglfw3.a(cocoa_joystick.m.o)
      __glfwPlatformPollJoystick in libglfw3.a(cocoa_joystick.m.o)
  "_CFArraySortValues", referenced from:
      _matchCallback in libglfw3.a(cocoa_joystick.m.o)

我从https://www.glfw.org/download.html 下载的二进制文件只包含 64 位二进制文​​件。

我正在使用以下 cmake 代码和文件夹结构

#include <iostream>
#include <glfw3.h>

int main() {
    std::cout << glfwInit() << std::endl;
    return 0;
}

最后,我的 Cmake 偏好

我很想知道为什么会一直发生这种情况以及我应该如何解决这个问题。

【问题讨论】:

  • 请在问题中添加文本形式的代码和错误消息,而不是图像。这是堆栈溢出的要求。另见How to Ask
  • 不相关:您应该使用设置包含和链接器目录的target_* 变体,因为它们仅适用于该目标而不是所有内容。

标签: c++ macos cmake clion glfw


【解决方案1】:

你读过the documentation吗?如果你这样编译,你会错过三个框架:

target_link_libraries(graphics glfw3 -framework Cocoa -framework OpenGL -framework IOKit)

最好只使用the find_package approach

【讨论】:

  • 我一生中从未使用过 CMake。我来自视觉工作室处理一切的窗户。显然我弄乱了 CMake 文件的顺序,现在问题似乎已经解决了。
  • @TheAlphaKarp,您能否详细说明您是如何解决的。我的问题与您的问题完全相同。谢谢!
  • 很抱歉,我没有那个项目了,我只记得 find_package 的顺序在项目中很重要。使用 XCode 解决这个问题比 clion 更容易。 en.wikibooks.org/wiki/OpenGL_Programming/Installation/Mac
  • @seelts 这里有一些文档,希望对您有所帮助programmersought.com/article/85305491112
【解决方案2】:

我遇到了完全相同的问题。
我正在使用 local(不是系统范围的)glfwglad
这是我最终得到的对我有用的 cmake 文件。

cmake_minimum_required(VERSION 3.17)
project(project_name)

set(CMAKE_CXX_STANDARD 14)
if (APPLE)
    set(CMAKE_CXX_FLAGS "-framework Cocoa -framework IOKit")
    # -framework OpenGL -framework CoreVideo
    add_compile_definitions(GL_SILENCE_DEPRECATION)
endif ()

include_directories(<your include dir here>)
add_executable(project_name <your source files here>)

target_link_libraries(project_name <path to libglfw3.a>)

真正帮助我的是set(CMAKE_CXX_FLAGS "-framework Cocoa -framework IOKit")

GL_SILENCE_DEPRECATION 部分似乎没有影响,所以可能可以忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 2017-03-01
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多