c - 使用 -L 选项后动态链接器给出 "cannot open shared object file: No such file or directory"

标签 c linker-errors

我有一个像这样的库的项目结构:

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/

相关文章:

c++ - 在函数 `uv__signal_global_init' : . .. 对 `pthread_atfork' 的 undefined reference

c - 如何获取我存储在子进程变量中的子进程外部变量的值?

将一行从文件复制到数组 (C)

c++ - 将 TagLib 链接到 Qt 时出错

ios - 链接器命令失败,退出代码为 1(使用 -v 查看调用)

C++ 构造函数继承无法正常工作

c - 具有动态链表的图形表示

c++ - 用 OpenGL 模糊?

Char数组声明问题

ios - Google Consent SDK - 链接器错误