繁体   English   中英

如何使用.so文件运行c程序

[英]How to run c program with .so file

我已经浏览了stackoverflow上的所有解决方案以及询问ubuntu。

我有一个去计划

package main

import "C"

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

func main() {}

我已生成.so文件,名称为t.so和头文件th

现在我想在我的C程序中使用这个功能。 我编写了代码,但我不知道如何执行它。

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

当我执行它时

gcc c.c t.so

它会生成一个.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

所以它生成co文件,它不可执行。

您应该使用链接器选项 -rpath ,它告诉链接器在可执行程序中添加信息,以便在哪里找到像.so文件这样的运行时库。

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

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

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

只要你不移动库,程序应该可以工作。


也可以使用环境变量LD_LIBRARY_PATH ,但不建议这样做

很可能你的装载机找不到库。 在运行二进制文件之前,尝试将路径放到libarry所在的目录中LD_LIBRARY_PATH

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

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

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

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

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

所以你的选择是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM