我有一个像这样的库的项目结构:
lib_ode/
src/
main/
c/
ode.c
incluce/
ode.h
test/
c/
test_ode.c
include/
target/
.objs/
test/
在这个结构中,我用这 4 个命令编译了我的项目:
(创建 lib 对象)
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 选项包括一个用于链接的文件夹,在第二个命令之后我可以在 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
(上面应该“硬编码”可执行文件中的附加动态库搜索路径。如果您稍后移动库,您将再次遇到错误。我不确定存储在可执行文件中的路径是相对路径还是绝对路径; 如果它是相对的,您需要将可执行文件和库保持在相对于彼此的相同路径)。
关于c - 使用 -L 选项后动态链接器给出 "cannot open shared object file: No such file or directory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44115894/