【问题标题】:How to run c program with .so file如何使用.so文件运行c程序
【发布时间】:2016-05-01 17:21:11
【问题描述】:

我已经浏览过 StackOverflow 以及 Ask Ubuntu 上的所有解决方案。

我有一个 Go 程序:

package main

import "C"

//export Getint
func Getint() int {
        return  2
}

func main() {}

我已经生成了 .so 文件,名称为 t.so and header filet.h`

现在我想在我的 C 程序中使用这个函数。
我已经写了代码,但我不知道如何执行。

#include <stdio.h>
#include <t.h>
int main()
{
int a;
a=Getint();
printf("number : %d",a);
return 0;
}

当我执行它时

gcc c.c t.so

它生成a.out文件

但在运行 a.out./a.out 时会出现错误:

./a.out
Error while loading shared libraries: t.so: can not open shared object file: no such file or directory exists.

然后我尝试了:

gcc -c c.c -l t.so

所以它会生成c.o 文件并且它是不可执行的。

【问题讨论】:

  • 所有这些文件都在同一个位置

标签: c gcc go shared-libraries shared-objects


【解决方案1】:

您应该使用LD_LIBRARY_PATH 让动态链接器在列表中找到您的共享库。语法类似于PATH: 分隔的目录列表。

在 OSX 上,此环境变量称为 DYLD_LIBRARY_PATH

【讨论】:

    【解决方案2】:

    .so 文件是共享对象,这意味着所有需要它们的应用程序都可以使用对象。也就是说,共享。由于这种特性,它们需要存放在众所周知的地方。此外,它们需要被动态链接器索引。

    例如,在 linux 中,您通常有一个文件 /etc/ld.so.conf,其中存储了自动读取共享对象的所有目录

    所以你的选择是:

    • 将您的共享对象文件放在众所周知的位置
    • 将您的共享对象文件放在您选择的位置并让动态链接器知道它:在 linux 中您可以修改 ld.so.conf 并运行 ldconfig更新 ld 索引
    • 正如其他人建议的那样,将 .so 的路径写入环境变量 LD_LIBRARY_PATH 中(因为动态链接器会在运行应用程序之前读取它)。这必须在每次创建环境时完成
    • 与其他建议一样,在编译时使用 -rpath。请注意,通过这种方式,您无法在编译后移动 .so 文件

    我个人更喜欢将 .so 文件安装在系统库路径中

    【讨论】:

      【解决方案3】:

      你应该使用linker option-rpath,它告诉链接器在可执行程序中添加信息,在哪里可以找到运行时库,比如你的.so文件。

      这可以使用 GCC 选项 -Wl 来完成,它指示 GCC 前端程序将选项传递给链接器:

      $ gcc c.c t.so -Wl,-rpath=$(pwd)
      

      这会将-rpath=$(pwd) 传递给链接器,$(pwd) 使shell 调用pwd 命令返回当前目录。

      只要您不移动库,程序就可以运行。


      也可以使用环境变量LD_LIBRARY_PATH,但它是not recommended

      【讨论】:

        【解决方案4】:

        很可能您的加载程序找不到该库。在运行二进制文件之前,尝试将库所在目录的路径放在LD_LIBRARY_PATH

        export LD_LIBRARY_PATH=/path/to/my/library
        ./a.out
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-17
          • 1970-01-01
          • 2014-01-15
          • 1970-01-01
          • 2014-08-22
          • 1970-01-01
          • 2018-08-01
          • 2012-04-01
          相关资源
          最近更新 更多