【发布时间】:2020-08-28 10:08:48
【问题描述】:
我有一个与 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
现在,为 dll 编译添加 -lm
gcc -Wall -Os -shared -fPIC lib.c -o lib.so -lm
./main
c = 6.000000
那么,问题是 - 为什么在这个特定的系统上必须使用 -lm 不仅用于主程序而且还用于插件?
【问题讨论】:
标签: c linker shared-libraries