C++ 程序未正确链接到 .so 文件
C++ program not linking to .so file properly
我构建了 GLEW(使用 make install
)用于我正在编写的一个小测试程序(如果需要,可以找到源代码 here)。我 运行 locate libGLEW.so
只是为了检查 GLEW 库是否正确安装,并得到以下输出:
/usr/lib64/libGLEW.so
/usr/lib64/libGLEW.so.2.0
/usr/lib64/libGLEW.so.2.0.0
这是完全正常的。然后我使用命令编译它:
g++ main.cpp -o main -lglfw -lGLEW -lGL -lX11 -lpthread -lXi -g
这也没有报错。但是,当我尝试执行程序时:
./main: error while loading shared libraries: libGLEW.so.2.0: cannot open shared object file: No such file or directory
只是为了进行完整性检查,我 运行 ldd main | grep "GLEW"
,果然:
libGLEW.so.2.0 => not found
我最初认为这可能是链接器没有搜索包含库的目录的问题。所以我 运行 命令 ld --verbose | grep "/usr/lib64"
那里 是 一个包含所需目录的 SEARCH_DIR:
... SEARCH_DIR("=/usr/lib64"); ...
这尤其令人困惑。我尝试使用 -L/usr/lib64
选项进行编译,但仍然存在相同的错误消息。我检查了库的符号链接是否正确,它们是:
lrwxrwxrwx 1 root root 16 Jul 15 10:22 libGLEW.so -> libGLEW.so.2.0.0
lrwxrwxrwx 1 root root 16 Jul 15 10:38 libGLEW.so.2.0 -> libGLEW.so.2.0.0
-rw-r--r-- 1 root root 707K Jul 15 10:22 libGLEW.so.2.0.0
我不确定到底是什么导致了这个问题,但我开始相信我没有正确安装这些库。感觉答案就在眼前,就是找不到。
在此先感谢您的帮助。
用-Wl,-rpath=/usr/lib64
编译
Debian 和 Ubuntu 不会将系统库安装到 /usr/lib64
中,并且您使用的安装说明对于这些系统是错误的。 (无论如何,绕过打包系统将库安装到 /usr
中并不是一个好主意。)默认情况下会搜索 /usr/local/lib
(与其他系统不同),因此您可以将库移动到该目录。
我构建了 GLEW(使用 make install
)用于我正在编写的一个小测试程序(如果需要,可以找到源代码 here)。我 运行 locate libGLEW.so
只是为了检查 GLEW 库是否正确安装,并得到以下输出:
/usr/lib64/libGLEW.so
/usr/lib64/libGLEW.so.2.0
/usr/lib64/libGLEW.so.2.0.0
这是完全正常的。然后我使用命令编译它:
g++ main.cpp -o main -lglfw -lGLEW -lGL -lX11 -lpthread -lXi -g
这也没有报错。但是,当我尝试执行程序时:
./main: error while loading shared libraries: libGLEW.so.2.0: cannot open shared object file: No such file or directory
只是为了进行完整性检查,我 运行 ldd main | grep "GLEW"
,果然:
libGLEW.so.2.0 => not found
我最初认为这可能是链接器没有搜索包含库的目录的问题。所以我 运行 命令 ld --verbose | grep "/usr/lib64"
那里 是 一个包含所需目录的 SEARCH_DIR:
... SEARCH_DIR("=/usr/lib64"); ...
这尤其令人困惑。我尝试使用 -L/usr/lib64
选项进行编译,但仍然存在相同的错误消息。我检查了库的符号链接是否正确,它们是:
lrwxrwxrwx 1 root root 16 Jul 15 10:22 libGLEW.so -> libGLEW.so.2.0.0
lrwxrwxrwx 1 root root 16 Jul 15 10:38 libGLEW.so.2.0 -> libGLEW.so.2.0.0
-rw-r--r-- 1 root root 707K Jul 15 10:22 libGLEW.so.2.0.0
我不确定到底是什么导致了这个问题,但我开始相信我没有正确安装这些库。感觉答案就在眼前,就是找不到。
在此先感谢您的帮助。
用-Wl,-rpath=/usr/lib64
Debian 和 Ubuntu 不会将系统库安装到 /usr/lib64
中,并且您使用的安装说明对于这些系统是错误的。 (无论如何,绕过打包系统将库安装到 /usr
中并不是一个好主意。)默认情况下会搜索 /usr/local/lib
(与其他系统不同),因此您可以将库移动到该目录。