Ubuntu 16下手动编译GLFW失败,apt-get安装却成功的问题咨询
解决Ubuntu 16上GLFW3手动编译失败、示例代码未定义引用的问题
嘿,我之前在Ubuntu上折腾GLFW3的时候也踩过一模一样的坑!手动编译安装各种报错,换用apt-get一键安装就秒成,其实问题根源很明确——手动编译时的配置或安装路径没处理好,导致编译器/链接器找不到GLFW的库文件。
一、先说说手动编译为啥会失败
你遇到的情况大概率是这几个原因之一:
- 安装路径不在系统默认搜索列表里:默认手动编译会把库装到
/usr/local/lib,但Ubuntu的链接器有时候不会自动扫这个路径,或者你编译示例时没手动指定-L/usr/local/lib。 - cmake参数没配全:比如你虽然加了
-DBUILD_SHARED_LIBS=ON建共享库,但可能没指定-DCMAKE_INSTALL_PREFIX=/usr,导致库装到了非系统默认目录。 - 忘了更新系统库缓存:手动安装完没跑
sudo ldconfig,系统压根不知道你装了新库,链接器自然找不到。
二、为啥apt-get安装就这么省心?
Ubuntu官方源里的libglfw3和libglfw3-dev包已经把所有细节给你处理妥了:
- 库文件直接放到
/usr/lib(系统链接器默认搜索的路径) - 头文件自动丢去
/usr/include(编译器默认找头文件的地方) - 安装完成后自动更新库缓存,根本不用你手动操作
三、如果非要手动编译,给你一套稳的步骤
要是你还是想自己编译源码(比如要装特定版本),按下面的步骤来绝对没问题:
- 先装编译依赖:
sudo apt-get install build-essential cmake xorg-dev libglu1-mesa-dev
- 下载源码解压:
wget https://github.com/glfw/glfw/releases/download/3.3.8/glfw-3.3.8.zip unzip glfw-3.3.8.zip cd glfw-3.3.8
- 建构建目录,用cmake配置(关键是指定安装到系统默认路径):
mkdir build cd build cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr ..
- 编译+安装,最后更新库缓存:
make -j$(nproc) # 用全核心编译,更快 sudo make install sudo ldconfig
- 编译示例代码时,记得链接GLFW和OpenGL库:
比如你的测试文件是test.c,编译命令得这么写:
gcc test.c -o test -lglfw -lGL
四、关于「未定义引用」错误的本质
这个错误说白了就是:编译器能找到GLFW的头文件(所以编译阶段没报错),但链接器找不到对应的共享库文件。手动安装时路径不对或者没更缓存,链接器就找不到libglfw.so,自然报未定义引用。而apt装的库在默认路径,链接器直接就能找到,所以编译一次过。
内容的提问来源于stack exchange,提问作者Xiaotian Hu
相关产品推荐
相关产品推荐

