动态链接器在使用 -L 选项后给出 "cannot open shared object file: No such file or directory"
Dynamic linker gives "cannot open shared object file: No such file or directory" after using -L option
我有一个像这样的库的项目结构:
lib_ode/
src/
main/
c/
ode.c
incluce/
ode.h
test/
c/
test_ode.c
include/
target/
.objs/
test/
在这个结构中,我用这 4 个命令编译了我的项目:
(创建库对象)
gcc -fPIC -O3 -DNDEBUG -g -Wall -Isrc/main/include -c -o "target/.objs/ode.o" src/main/c/ode.c
(创建库)
gcc -shared target/.objs/ode.o -lm -o "target/libode.so"
(创建测试对象)
gcc -fPIC -O3 -DNDEBUG -g -Wall -Isrc/main/include -c -Isrc/test/include -o target/.objs/test.o src/test/c/test_ode.c
(创建测试)
gcc -L./target -lode target/.objs/test.o -o target/test/test.out
然后我尝试 运行 target/test/test.out 并得到这个错误。
target/test/test.out:加载共享库时出错:libode.so:无法打开共享对象文件:没有这样的文件或目录
据我所知,-L 选项包括 link 的文件夹,在第二个命令后我可以在 target/libode.so 找到一个文件.
那我做错了什么?
您已经创建了一个动态链接到任意目录中的库的可执行文件。在 运行 时,动态链接器找不到库(它不存在于任何标准搜索路径中),因此给您错误。
对于运行程序,您可以设置LD_LIBRARY_PATH
环境变量:
LD_LIBRARY_PATH="`pwd`/target" target/test/test.out
您也可以尝试链接 -rpath
(我没试过):
gcc -L./target -Wl,-rpath,./target -lode target/.objs/test.o -o target/test/test.out
(上面应该"hardcode"可执行文件中的附加动态库搜索路径。如果你稍后移动库会再次出错。我不确定可执行文件中存储的路径是否会是相对的还是绝对的;如果是相对的,您需要将可执行文件和库保持在相对于彼此的同一路径中。
我有一个像这样的库的项目结构:
lib_ode/
src/
main/
c/
ode.c
incluce/
ode.h
test/
c/
test_ode.c
include/
target/
.objs/
test/
在这个结构中,我用这 4 个命令编译了我的项目:
(创建库对象)
gcc -fPIC -O3 -DNDEBUG -g -Wall -Isrc/main/include -c -o "target/.objs/ode.o" src/main/c/ode.c
(创建库)
gcc -shared target/.objs/ode.o -lm -o "target/libode.so"
(创建测试对象)
gcc -fPIC -O3 -DNDEBUG -g -Wall -Isrc/main/include -c -Isrc/test/include -o target/.objs/test.o src/test/c/test_ode.c
(创建测试)
gcc -L./target -lode target/.objs/test.o -o target/test/test.out
然后我尝试 运行 target/test/test.out 并得到这个错误。
target/test/test.out:加载共享库时出错:libode.so:无法打开共享对象文件:没有这样的文件或目录
据我所知,-L 选项包括 link 的文件夹,在第二个命令后我可以在 target/libode.so 找到一个文件.
那我做错了什么?
您已经创建了一个动态链接到任意目录中的库的可执行文件。在 运行 时,动态链接器找不到库(它不存在于任何标准搜索路径中),因此给您错误。
对于运行程序,您可以设置LD_LIBRARY_PATH
环境变量:
LD_LIBRARY_PATH="`pwd`/target" target/test/test.out
您也可以尝试链接 -rpath
(我没试过):
gcc -L./target -Wl,-rpath,./target -lode target/.objs/test.o -o target/test/test.out
(上面应该"hardcode"可执行文件中的附加动态库搜索路径。如果你稍后移动库会再次出错。我不确定可执行文件中存储的路径是否会是相对的还是绝对的;如果是相对的,您需要将可执行文件和库保持在相对于彼此的同一路径中。