使用GLFW3编译时,出现链接错误“未定义的引用”。

6

以下是使用GLFW3的最简示例:

#include <GLFW/glfw3.h>

int main(int argc, const char * argv[]) {
    glfwInit();
}

...结果会导致大量的链接错误:(摘录)

Undefined symbols for architecture x86_64:
  "_CFArrayAppendValue", referenced from:
      _addJoystickElement in libglfw3.a(cocoa_joystick.m.o)
  "_CFArrayApplyFunction", referenced from:
      __glfwInitJoysticks in libglfw3.a(cocoa_joystick.m.o)
      _addJoystickElement in libglfw3.a(cocoa_joystick.m.o)
  "_CFArrayCreateMutable", referenced from:
      __glfwInitJoysticks in libglfw3.a(cocoa_joystick.m.o)

  ...

  "_objc_msgSend_fixup", referenced from:
  l_objc_msgSend_fixup_count in libglfw3.a(cocoa_monitor.m.o)
  l_objc_msgSend_fixup_objectAtIndex_ in libglfw3.a(cocoa_monitor.m.o)
  l_objc_msgSend_fixup_objectForKey_ in libglfw3.a(cocoa_monitor.m.o)
  l_objc_msgSend_fixup_alloc in libglfw3.a(cocoa_init.m.o)
  l_objc_msgSend_fixup_release in libglfw3.a(cocoa_init.m.o)
  l_objc_msgSend_fixup_alloc in libglfw3.a(nsgl_context.m.o)
  l_objc_msgSend_fixup_release in libglfw3.a(nsgl_context.m.o)
  ...

OpenGL.frameworklibglfw3.a都被链接。

输入图像说明

这是为什么呢?以前编译glfw2应用程序就能很好地工作。


1
glfw3 可能已经从 Carbon (C) 切换到 Cocoa (Objective C) 作为其渲染上下文 / 窗口管理接口。随着每个 OS X 版本,越来越少的核心 OS 功能通过 Carbon 接口暴露出来,如果您正在编写基于 64 位 Carbon 的应用程序,则情况会变得更糟。尝试将 Cocoa 框架添加到您的构建配置中。 - Andon M. Coleman
你解决问题了吗? - roschach
@FrancescoBoi 我不得不链接 IOKitCoreVideoCocoa 框架。请参见这个问题的答案。 - Appleshell
2个回答

26

2
目前,这就是完整的答案。谢谢。 - user430788
3
谢谢。以下是让我的系统成功执行的命令行,供参考:gcc -Iglfw3/include/ -Lglfw3/lib/ -lglfw3 -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo main.c - damix911
在我的情况下,我只需要-l glfw3 就解决了。 - Barry
如果有人对使用Swift 3和GLFW感兴趣,请查看以下链接:https://github.com/ValeriyKliuk/GLFW - Valeriy Kliuk
我添加了所有推荐的内容,除了 OpenGL(因为我正在使用 Vulkan 进行构建),而且它也起作用了。 - wcochran

12

在Mac OS X中,glfw3使用Cocoa(NSGL)来管理其OpenGL上下文。glfw2使用Carbon(根据全屏或窗口模式使用CGL / AGL)。

NSGL更加健壮,但它是建立在Objective C框架(Cocoa)之上的。为了让您的软件与glfw3正确地配合工作,您应该包含Cocoa框架。


嘿,谢谢你的答案,解决了我的问题。除了Cocoa框架外,还需要IOKit框架。 - Appleshell
1
我之前也遇到了这个问题,除了需要添加 CocoaIOKit 外,我还需要添加 CoreVideo 框架,然后问题就解决了。 - TrevorPeyton
@TrevorPeyton:啊,我明白了。当我最初写这个答案时,只是为了解释原问题中未解决的符号。看来GLFW3引入的依赖关系比我最初想象的要多。 - Andon M. Coleman

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