动态链接器在使用 -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"可执行文件中的附加动态库搜索路径。如果你稍后移动库会再次出错。我不确定可执行文件中存储的路径是否会是相对的还是绝对的;如果是相对的,您需要将可执行文件和库保持在相对于彼此的同一路径中。