首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用libm链接共享库

用libm链接共享库
EN

Stack Overflow用户
提问于 2020-08-28 10:08:48
回答 1查看 350关注 0票数 2

我有一个与libm链接(动态)的程序。这个程序也有几个插件。插件以dlopen()的方式加载。其中一些插件使用libm中的循环()。

在一个系统(Linux 19.1 gcc 7.5.0)上,由于未解决的循环问题,程序无法工作。

下面是一个简单的例子:

  1. 库(lib.c)

# #包含 void ( double a,double b) {double c;c=圆形(a+ b);printf("c = %lf\n",c);}

  1. 主程序(main.c)

#包含 #包括dlopen * dll; (*f)(双,双);double a= 1.234,b= 4.321;int ( void ){dll= dlopen("./lib.so",RTLD_LAZY);f= dlsym(dll,"func");f(a,b);返回0;}。

  1. 大楼(Makefile)

全部: gcc -Wall -Os -shared -fPIC lib.c -o lib.so gcc -Wall -Os -rdynamic -fPIC main.c -o main -ldl -lm

  1. 运行Debian 8,gcc 4.9.2

./main c= 6.000000

  1. 运行于LinuxMint19.1,gcc 7.5.0

./main ./main:符号查找错误:./lib.so:未定义符号:圆形

现在,为dll编译添加-lm。

代码语言:javascript
复制
    gcc -Wall -Os -shared -fPIC lib.c -o lib.so -lm

     ./main 
    c = 6.000000

所以,问题是-为什么在这个特定的系统中,不仅要在主程序上使用-lm,而且要在插件上使用它?

EN

回答 1

Stack Overflow用户

发布于 2020-08-28 10:18:31

与可执行程序一样,共享库也是链接实体(与静态库不同,静态库是对象文件的存档)。

由于共享库像可执行文件一样链接,所以还需要链接到库所依赖的库:

代码语言:javascript
复制
gcc -Wall -Os -shared -fPIC lib.c -o lib.so -lm
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63631712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档