我有一个与libm链接(动态)的程序。这个程序也有几个插件。插件以dlopen()的方式加载。其中一些插件使用libm中的循环()。
在一个系统(Linux 19.1 gcc 7.5.0)上,由于未解决的循环问题,程序无法工作。
下面是一个简单的例子:
# #包含 void ( double a,double b) {double c;c=圆形(a+ b);printf("c = %lf\n",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;}。
全部: gcc -Wall -Os -shared -fPIC lib.c -o lib.so gcc -Wall -Os -rdynamic -fPIC main.c -o main -ldl -lm
./main c= 6.000000
./main ./main:符号查找错误:./lib.so:未定义符号:圆形
现在,为dll编译添加-lm。
gcc -Wall -Os -shared -fPIC lib.c -o lib.so -lm
./main
c = 6.000000所以,问题是-为什么在这个特定的系统中,不仅要在主程序上使用-lm,而且要在插件上使用它?
发布于 2020-08-28 10:18:31
与可执行程序一样,共享库也是链接实体(与静态库不同,静态库是对象文件的存档)。
由于共享库像可执行文件一样链接,所以还需要链接到库所依赖的库:
gcc -Wall -Os -shared -fPIC lib.c -o lib.so -lmhttps://stackoverflow.com/questions/63631712
复制相似问题