【发布时间】:2018-09-30 15:58:15
【问题描述】:
我是 Ubuntu 的新手,直到现在我一直在 Mac 中使用 glfw3 进行编程。问题如下。在我下载了glfw3包之后
sudo aptitude install libglfw3 libglfw3-dev
在 Ubuntu 上,我检查了 glfw3 库的位置。我在网上搜索了一下,发现dpkg --listfiles packagename 返回了与我安装的包相关的所有文件的路径。 dpkg --listfiles libglfw3 的结果是这样的。 (我将只显示带有 .so 文件的路径)
/usr/lib/x86_64-linux-gnu/libglfw.so.3.2
/usr/lib/x86_64-linux-gnu/libglfw.so.3
dpkg --listfiles libglfw3-dev的结果是这样的。
/usr/lib/x86_64-linux-gnu/libglfw.so
.so 文件有 3 种类型,所以我想使用最新的(3.2),而使用 3.2 版本的 makefile 在 Mac 中运行良好。这是我尝试在 Ubuntu 中使用的 makefile
LINK_TARGET = Animation
OBJS = glad.o Animation.o
REBUILDABLES = $(OBJS) $(LINK_TARGET)
INCLUDES = -I/usr/include
all : $(LINK_TARGET)
echo All successfully linked!
$(LINK_TARGET) : $(OBJS)
g++ -o $@ $^ -L/usr/lib/x86_64-linux-gnu -ldl -lglfw.3.2
Animation.o : Animation.cpp
g++ -c Animation.cpp $(INCLUDES)
glad.o : glad.c
g++ -c glad.c $(INCLUDES)
clean :
rm -f $(REBUILDABLES)
echo Clean done!
如果我们专注于这条线
$(LINK_TARGET) : $(OBJS)
g++ -o $@ $^ -L/usr/lib/x86_64-linux-gnu -ldl -lglfw.3.2
-lglfw.3.2 选项过去在 Mac 中运行良好(尽管 Mac 曾经是 .dylib 文件而不是 .so 文件。-ldl 标志在 Mac 中也不需要)。现在,如果运行 makefile,它会打印错误消息 /usr/bin/ld: cannot find -lglfw3.2。
如果我将选项-lglfw3.2 更改为-lglfw,makefile 会成功运行,但我不明白为什么。 libglfw.so.3.2 和 libglfw.so 都存在于目录中。我想了解为什么会这样。提前致谢!
【问题讨论】:
-
我的猜测是使用
-lglfw3.2将尝试将其与libglfw3.2.so链接而不是libglfw.so.3.2。即使您可以使用该特定版本进行链接(可以直接传递.so文件进行链接,理想情况下是静态的),但最好使用-lglfw。这将使用libglfw.so,我假设它是指向libglfw.so.3的符号链接,它是指向libglfw.so.3.2的符号链接。您可以通过ls -la /usr/lib/x86_64-linux-gnu/libglfw.so*查看链接。您可以使用ldd glad查看.so依赖项。 -
@zxxc 你是对的!这是一个符号链接。我不知道符号链接是什么,但现在我知道了,多亏了你。很高兴我可以简单地绑定 -lglfw。而且我认为您的猜测是正确的,因为在 Mac 中,库文件名是 libglfw.3.2.dylib 而不是 libglfw.dylib.3.2。还是谢谢!