无法让 GLFW 链接

2024-03-14

我正在尝试编译以下测试程序:

#include <GL/glfw.h>

int main(int argc, char** argv) {
    if(!glfwInit()) {
        return -1;
    }

    if(!glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) {
        return -1;
    }

    while(glfwGetWindowParam(GLFW_OPENED)) {
        glfwSwapBuffers();
    }

    return 0;
}

但我总是得到undefined reference有关 GLFW 功能的错误。

下面是我的 makefile:

CXX = clang++
CXXFLAGS = -Wall -std=c++0x
LDFLAGS = -lglfw

OBJ_DIR = bin
LIB_DIR = -L/usr/lib
INC_DIR = -I/usr/include

SOURCE = main.cpp
OBJECTS = ${SOURCE:%.cpp=$(OBJ_DIR)/%.o}
EXECUTABLE = hello

all: init $(OBJECTS) $(EXECUTABLE)

$(EXECUTABLE):
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIB_DIR) -o $@ $(OBJECTS)

$(OBJ_DIR)/%.o: %.cpp
    $(CXX) $(INC_DIR) -c $< -o $@

init:
    @mkdir -p "$(OBJ_DIR)"

clean:
    @rm -rf $(OBJ_DIR) $(EXECUTABLE)

我绝对有glfw.h and libglfw.a/.so当我跑步时locate glfw I get:

:~$ locate glfw
/usr/include/GL/glfw.h
/usr/lib/libglfw.a
/usr/lib/libglfw.so
/usr/lib/libglfw.so.2
/usr/lib/libglfw.so.2.6

的输出nm /usr/lib/libglfw.a | grep glfwInit:

:~$ nm /usr/lib/libglfw.a | grep glfwInit
                 U _glfwInitialized
                 U _glfwInitialized
                 U _glfwInitialized
                 U _glfwInitialized
0000000000000000 B _glfwInitialized
0000000000000000 T glfwInit
                 U _glfwInitialized
                 U _glfwInitialized
                 U _glfwInitialized
                 U _glfwInitialized
                 U _glfwInitialized
                 U _glfwInitJoysticks
                 U _glfwInitTimer
00000000000000c0 T _glfwInitJoysticks
0000000000000000 T _glfwInitTimer

以及来自 clang 的详细消息:

clang++ -I/usr/include -c main.cpp -o bin/main.o
clang++ -Wall -std=c++0x -Wl --verbose -lglfw -lGL -lGLU -L/usr/lib -o hello bin/main.o
Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)
Target: x86_64-pc-linux-gnu
Thread model: posix
clang: warning: argument unused during compilation: '-std=c++0x'
 "/usr/bin/ld" -z relro --hash-style=gnu --as-needed --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/usr/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. -L/lib/x86_64-linux-gnu -L/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib -lglfw -lGL -lGLU bin/main.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
bin/main.o: In function `main':
main.cpp:(.text+0x17): undefined reference to `glfwInit'
main.cpp:(.text+0x76): undefined reference to `glfwOpenWindow'
main.cpp:(.text+0x97): undefined reference to `glfwGetWindowParam'
main.cpp:(.text+0xa7): undefined reference to `glfwSwapBuffers'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [hello] Error 1

好像没找到图书馆?


问题在于,glfw 库是在依赖于它们的目标文件之前指定给链接器的。ld搜索库以仅解决其正在处理的文件列表中已知的依赖项的依赖项。所以当ld正在寻找libglfw.a它不知道glfwInit依赖于main.o yet. ld(默认情况下)不会返回再次搜索库。

Try:

$(EXECUTABLE):
    $(CXX) $(CXXFLAGS) $(LIB_DIR) -o $@ $(OBJECTS)  $(LDFLAGS)

此外,这些库可能应该在LDLIBS (or LIBS) 多变的 -LDFLAGS通常用于链接器选项:

CXX = clang++
CXXFLAGS = -Wall -std=c++0x
LDLIBS = -lglfw -lGL -lGLU

OBJ_DIR = bin
LIB_DIR = -L/usr/lib
INC_DIR = -I/usr/include

SOURCE = main.cpp
OBJECTS = ${SOURCE:%.cpp=$(OBJ_DIR)/%.o}
EXECUTABLE = hello

all: init $(OBJECTS) $(EXECUTABLE)

$(EXECUTABLE):
    $(CXX) $(LDFLAGS) $(LIB_DIR) -o $@ $(OBJECTS) $(LDLIBS)

$(OBJ_DIR)/%.o: %.cpp
    $(CXX) $(INC_DIR) -c $< -o $@

init:
    @mkdir -p "$(OBJ_DIR)"

clean:
    @rm -rf $(OBJ_DIR) $(EXECUTABLE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法让 GLFW 链接 的相关文章

随机推荐

  • mongoose .find() 方法返回具有不需要的属性的对象

    所以 我和猫鼬一起工作已经有一段时间了 我发现了一些非常奇怪的事情 如果有人能启发我 那就太好了 问题是 当使用 mongoose 的 find 方法时 我作为响应得到的对象充满了我不知道它来自哪里的属性 我猜测它们是内置属性 但无论如何
  • 有没有办法为 Class::DBI 提供缓存机制?

    我有一组相当复杂的 ORM 模块 它们继承自类别 DBI http search cpan org dist Class DBI 由于数据变化很少 我正在考虑在此之上使用缓存 记忆层来加快速度 我找到了一个模块 类 DBI 可缓存 http
  • Swift 中的飞利浦 HUE SDK

    我对斯威夫特很陌生 我确实有一些使用 Objective C 的经验 尽管距离我真正用它写过任何东西已经有两年了 我正在尝试将 Phillips HUE SDK 与 Swift 一起使用 但遇到了一些问题 我正在尝试将以下 Objectiv
  • form_for 中的 Rails 参数

    我正在制作一个用于更新或保存已保存消息的表单 subject recipients br
  • 寻找行为类似于 InRequestScope 的 Ninject 作用域

    在我的服务层上我注入了一个UnitOfWork以及构造函数中的 2 个存储库 工作单元和存储库有一个实例DbContext我想在他们两个之间分享 我怎样才能用 Ninject 做到这一点 应该考虑哪些范围 I am 不在网络应用程序中所以我
  • Prometheus 警报管理器不发送警报 k8s

    我使用 Prometheus Operator 0 3 4 和警报管理器 0 20 但它不起作用 即我看到警报被触发 在警报选项卡上的 Prometheus UI 上 但我没有收到任何电子邮件警报 通过查看日志 我看到以下内容 知道吗 请参
  • 防止来自 __doPostBack 的完全回发

    我有一个内容页面 其中包含以下内容 UpdatePanel1 包含错误显示 Div包含两个按钮的更新触发器 UpdatePanel2 包含带有 asp button 的进程 1 updatePanel3 包含带有 asp button 的进
  • 监控 Commons DBCP?

    我的 Tomcat 中的一个巨大的 Web 应用程序有时会开始使用过多的 DBCP 连接 从而导致问题 为了进行调查 我想准确地知道每个时间点哪个线程 方法正在持有池的连接 不需要实时 事后分析就可以了 我一直在寻找这样的DBCP监控工具
  • 删除 Django Crispy Form 中的标签

    有谁知道是否有正确的方法来去除酥脆形式的标签 我到目前为止 self fields field label 但这不是一个很好的解决方案 Just do self helper form show labels False 删除所有标签
  • Java BufferedReader 在循环之前检查循环的下一行

    我正在解析 csv 文件 对于 cvs 的每一行 我使用解析的值创建一个对象 并将它们放入一个集合中 在将对象放入地图并循环到下一个对象之前 我需要检查下一个 cvs 行是否与实际对象相同 但特定属性值不同 为此 我需要检查缓冲区的下一行
  • Djangolush 与 sqlclear 和syncdb

    谁能告诉我们之间是否有区别 gt manage py flush or reset and gt manage py sqlclear appname python manage py dbshell gt manage py syncdb
  • 何时何地调用 VB.NET 中的RemoveHandler?

    我正在开发 NET 1 1 中的 VB NET windows 窗体项目 我有这种类型的架构 非常简单 Public MustInherit Class BaseTestLogic Private TimerPoll As Timer Pu
  • 在 HTML 中设置自定义锚点

    我在帖子中看到过这个主题here https stackoverflow com questions 9380034 setting custom anchorpoint and here https stackoverflow com q
  • 如何解决此 TypeORM 错误“EntityRepository 已弃用,请改用 Repository.extend 函数”?

    但是 我在 Repository 类中找不到任何 Repository extend 方法 文档中也没有任何相关内容 怎么解决这个问题呢 类型版本 0 3 0 我正在使用 Nest js 并尝试创建自定义存储库 首先 npm install
  • PHPExcel $objWriter->save() 失败

    我正在使用 PHPExcel 根据数据库中的记录创建一个 Excel 文件 在大型数据集上生成它时遇到一个奇怪的问题 我已将其范围缩小到一个引起问题的行 objWriter gt save php output 它只是输出一个空白文件而不是
  • PHP 中如何存储持久数据库连接?

    如文档中所述sqlite popen http de php net manual en function sqlite popen phpphp 尝试利用持久资源机制 哪里详细描述了这个机制 是否可以查看当前存储 使用的所有资源 是否可以
  • 在哪里放置不同测试类的通用设置代码?

    我有几个不同的测试类 它们要求在运行这些测试之前创建某些对象 现在我想知道是否应该将对象初始化代码放入单独的帮助器类或超类中 这样做肯定会减少我的测试类中重复代码的数量 但也会降低它们的可读性 是否有如何处理单元测试的常见设置代码的指南或模
  • 存储缓冲区是否保存现代 x86 上的物理地址或虚拟地址?

    现代 Intel 和 AMD 芯片大存储缓冲区 https stackoverflow com a 54880249 149138在提交到 L1 缓存之前缓冲存储 从概念上讲 这些条目保存存储数据和存储地址 对于地址部分 这些缓冲区条目是否
  • GtKGLArea 无法创建 OpenGL 2.1 上下文

    我目前正在为我的游戏引擎项目开发一个简单的编辑器 虽然该项目似乎在我的主工作站 支持 OpenGL 3 3 的 GTX 650Ti 上运行得很好 但当我在我的设备上测试它时 它似乎被破坏了 测试桌面 GMA4500 最大支持 OpenGL
  • 无法让 GLFW 链接

    我正在尝试编译以下测试程序 include