【问题标题】:how to covert dynamic linking to static linking如何将动态链接转换为静态链接
【发布时间】:2013-06-14 15:26:49
【问题描述】:

我有一个使用 libevent 库的程序

编译程序时,编译命令如下:

 gcc -o myprogram mysource.c mysource.h -levent 

所以它是动态链接。

现在我想在没有 libevent 的计算机上运行这个程序, 我需要静态链接,以便我的程序可以在那台计算机上运行, 有什么简单的步骤吗?

我试过-static,但出现以下错误:

    [root@kitty relay]# gcc  -o relay -static mysource.c mysource.h -levent -lpcap
    /usr/bin/ld: cannot find -lpcap
    /usr/bin/ld: cannot find -lc
    collect2: ld returned 1 exit status

为什么?

【问题讨论】:

    标签: c linux static-linking dynamic-linking libevent


    【解决方案1】:

    你应该有libevent.a。然后你就可以gcc -o myprogram mysource.c libevent.a

    或者试试gcc -o myprogram -static mysource.c -levent

    (您可能不应该将mysource.h 指定给gcc,因为它很可能与#include "mysource.h" 一起包含在mysource.c 中。)

    【讨论】:

    • 如果我有多个共享库,比如-lpcap、-levent,并且我只想静态链接libevent而动态链接libpcap,是否可以?谢谢!
    • 然后不要指定-static选项,而是将libevent.a传递给链接器(就像在第一个命令中一样)并添加-lpcap
    • 我试过gcc -o relay -static mysource.c mysource.h /usr/local/lib/libevent.a -lpcap,但我得到了错误:比如/home/wgong/Downloads/package/libevent-1.4.14b-stable/event.c:150: undefined reference to clock_gettime。为什么?
    • 谢谢,-lrt 没问题,你能解释一下-lrt 吗?谢谢!
    • 它告诉链接器使用librt 库。好吧,我猜想 libevent.so 会动态链接到 librt.so (它的函数使用来自 librt 的函数),并且当我们动态链接 libevent 时它由加载器处理。但是当我们静态链接 libevent 时,我们需要在链接时解析来自 libevent 的所有调用。
    【解决方案2】:

    来自GCC documentation

    -static

    在支持动态链接的系统上,这会阻止与共享库的链接。在其他系统上,此选项无效。

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2010-12-31
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      相关资源
      最近更新 更多