![](/img/trans.png)
[英]call to pow libm function seems to be getting resolved without linking with the library
[英]Linking shared library with libm
我有一个与 libm 链接(动态)的程序。 这个程序还有几个插件。 插件使用 dlopen() 显式加载。 其中一些插件使用 libm 中的 round()。
在一个系统(Linux Mint 19.1 gcc 7.5.0)上,由于未解决的回合,程序无法运行。
这是一个简单的例子:
图书馆 (lib.c)
#include <stdio.h> #include <math.h> void func(double a, double b) { double c; c = round(a + b); printf("c = %lf\\n", c); }
主程序(main.c)
#include <stdio.h> #include <dlfcn.h> void *dll; void (*f)(double, double); double a = 1.234, b = 4.321; int main(void) { dll = dlopen("./lib.so", RTLD_LAZY); f = dlsym(dll, "func"); f(a,b); return 0; }
构建(生成文件)
all: gcc -Wall -Os -shared -fPIC lib.c -o lib.so gcc -Wall -Os -rdynamic -fPIC main.c -o main -ldl -lm
在 Debian 8、gcc 4.9.2 上运行
./main c = 6.000000
在 Linux Mint 19.1、gcc 7.5.0 上运行
./main ./main: symbol lookup error: ./lib.so: undefined symbol: round
现在,添加 -lm 进行 dll 编译
gcc -Wall -Os -shared -fPIC lib.c -o lib.so -lm
./main
c = 6.000000
所以,问题是 - 为什么在这个特定的系统上,不仅必须将 -lm 用于主程序,还必须用于插件?
就像可执行程序一样,共享库是链接实体(与作为目标文件存档的静态库不同)。
由于共享库像可执行文件一样链接,因此您还需要链接库所依赖的库:
gcc -Wall -Os -shared -fPIC lib.c -o lib.so -lm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.