繁体   English   中英

使用 libm 链接共享库

[英]Linking shared library with libm

我有一个与 libm 链接(动态)的程序。 这个程序还有几个插件。 插件使用 dlopen() 显式加载。 其中一些插件使用 libm 中的 round()。

在一个系统(Linux Mint 19.1 gcc 7.5.0)上,由于未解决的回合,程序无法运行。

这是一个简单的例子:

  1. 图书馆 (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); }
  2. 主程序(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; }
  3. 构建(生成文件)

     all: gcc -Wall -Os -shared -fPIC lib.c -o lib.so gcc -Wall -Os -rdynamic -fPIC main.c -o main -ldl -lm
  4. 在 Debian 8、gcc 4.9.2 上运行

     ./main c = 6.000000
  5. 在 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.

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