glfw3 error: DSO Missing from command line
glfw3 error: DSO Missing from command line
我最近不得不在我的 PC 上重新安装 Linux Mint。我重新安装了我所有的库,例如 GLFW,并遇到了一个我以前从未见过的错误。不幸的是,我的 google-fu 技能似乎达不到这个错误的标准,因为我找不到任何适合我的修复方法。旁注:这些程序在我的旧安装上编译得很好,它们在我的笔记本电脑上也编译得很好,我的笔记本电脑也运行 Linux Mint 17.2.
这是我用来编译的编译语句:
g++ -std=c++11 main.cpp -o out -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi
这是终端向我吐出的内容:
/usr/bin/ld: //usr/local/lib/libglfw3.a(glx_context.c.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libdl.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
编辑:
为了尝试解决这个问题,我已经重新安装了两次 Mint。每次都出现。
看起来缺少的符号来自 libdl
。
作为额外的奖励,我将为您提供一个 Makefile。请记住缩进制表符,而不是空格,否则 Makefile 将无法工作。
all: out
clean:
rm -f out *.o
.PHONY: all clean
CXX = g++
CPPFLAGS =
CXXFLAGS = -std=c++11 -Wall -Wextra -g
LIBS = -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -pthread -lXi -ldl
LDFLAGS =
out: main.o
$(CXX) $(LDFLAGS) -o $@ $^ $(LIBS)
但是,如果您使用 pkg-config
会容易得多。我不知道正确的命令(我现在不在 Linux 所以我无法检查),但它看起来像这样:
packages = glfw3
CPPFLAGS := $(shell pkg-config --cflags $(packages))
LIBS := $(shell pkg-config --libs $(packages))
这样您甚至不必知道您需要 -ldl
,因为 pkg-config
会为您解决。这是做事的标准方式。
自己尝试 运行ning pkg-config --libs glfw3
以查看输出。如果没有安装,运行 sudo apt-get install pkg-config
.
我只是想为像我这样经验不足的程序员简化 Dietrich Epp 的回答:
为了解决这个问题,link libdl 库通过您的编译器方法所需的任何方式。如果使用命令行 (gcc):将“-ldl”添加到 linking 命令,以便上面 DavidBittner 的原始 linking 命令变为:
g++ -std=c++11 main.cpp -o out -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl
注意最后添加的“-ldl”。
如果您使用的是 Cmake,请将“dl”添加到附加库列表中。
我最近不得不在我的 PC 上重新安装 Linux Mint。我重新安装了我所有的库,例如 GLFW,并遇到了一个我以前从未见过的错误。不幸的是,我的 google-fu 技能似乎达不到这个错误的标准,因为我找不到任何适合我的修复方法。旁注:这些程序在我的旧安装上编译得很好,它们在我的笔记本电脑上也编译得很好,我的笔记本电脑也运行 Linux Mint 17.2.
这是我用来编译的编译语句:
g++ -std=c++11 main.cpp -o out -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi
这是终端向我吐出的内容:
/usr/bin/ld: //usr/local/lib/libglfw3.a(glx_context.c.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libdl.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
编辑: 为了尝试解决这个问题,我已经重新安装了两次 Mint。每次都出现。
看起来缺少的符号来自 libdl
。
作为额外的奖励,我将为您提供一个 Makefile。请记住缩进制表符,而不是空格,否则 Makefile 将无法工作。
all: out
clean:
rm -f out *.o
.PHONY: all clean
CXX = g++
CPPFLAGS =
CXXFLAGS = -std=c++11 -Wall -Wextra -g
LIBS = -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -pthread -lXi -ldl
LDFLAGS =
out: main.o
$(CXX) $(LDFLAGS) -o $@ $^ $(LIBS)
但是,如果您使用 pkg-config
会容易得多。我不知道正确的命令(我现在不在 Linux 所以我无法检查),但它看起来像这样:
packages = glfw3
CPPFLAGS := $(shell pkg-config --cflags $(packages))
LIBS := $(shell pkg-config --libs $(packages))
这样您甚至不必知道您需要 -ldl
,因为 pkg-config
会为您解决。这是做事的标准方式。
自己尝试 运行ning pkg-config --libs glfw3
以查看输出。如果没有安装,运行 sudo apt-get install pkg-config
.
我只是想为像我这样经验不足的程序员简化 Dietrich Epp 的回答:
为了解决这个问题,link libdl 库通过您的编译器方法所需的任何方式。如果使用命令行 (gcc):将“-ldl”添加到 linking 命令,以便上面 DavidBittner 的原始 linking 命令变为:
g++ -std=c++11 main.cpp -o out -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl
注意最后添加的“-ldl”。
如果您使用的是 Cmake,请将“dl”添加到附加库列表中。