【问题标题】:Error when statically linking libgmp on Linux在 Linux 上静态链接 libgmp 时出错
【发布时间】:2011-11-08 21:07:38
【问题描述】:

GMP 文档说静态链接可能会提供小的性能改进。

我无法让它在我的 Linux 系统上静态链接 libgmp。我已将我遇到的问题缩小到一个小测试用例。

gmptest.c

#include <gmp.h>

int main(int argc, char** argv) {
    mpz_t foo;
    mpz_init(foo);
    return 0;
}

生成文件:

all: clean gmptest static

clean:
    rm -f *.s
    rm -f *.o
    rm -f gmptest
    rm -f static-gmptest

gmptest: Makefile gmptest.c
    gcc -std=c99 -O3 -lgmp gmptest.c -o gmptest

static: clean Makefile gmptest.c
    gcc -std=c99 -O3 -static /usr/lib/libgmp.a gmptest.c -o static-gmptest

编译和链接非静态二进制文件没有任何问题,但“Make static”会产生:

gcc -std=c99 -O3 -static /usr/lib/libgmp.a gmptest.c -o static-gmptest
/tmp/ccWSFke9.o: In function `main':
gmptest.c:(.text+0x8): undefined reference to `__gmpz_init'
collect2: ld returned 1 exit status
make: *** [static] Error 1

图书馆确实存在:

chris@vostro:~/Dropbox/static$ ls -lA /usr/lib/libgmp.a 
-rw-r--r-- 1 root root 1041666 2010-02-26 13:20 /usr/lib/libgmp.a

我也尝试过 -lgmp 进行静态链接,但错误是一样的。

这一切都在 Ubuntu 10.04 和 10.10 AMD64 上。

有人可以告诉我我正在犯的明显错误吗?

谢谢,

克里斯。

【问题讨论】:

  • 您是否尝试过重新排序,以便在命令行中 users-of-library 之后需要库?

标签: c static-linking gmp


【解决方案1】:

试试

 gcc -std=c99 -O3 -static gmptest.c -lgmp -o static-gmptest

因为库应该始终以良好的顺序链接,并且在使用它们的程序或目标文件之后。

【讨论】:

  • 谢谢,这是链接的顺序。
  • 这种情况经常发生在刚接触 C/C++ 的人身上。我想知道他们将来是否会添加某种警告。这肯定会节省很多时间。
  • 现在,这很好,如果你想让所有东西都静态链接
【解决方案2】:

在这里,在 GMP 6.1.2 / MINGW 中并假设具有一定的可移植性,我发现标头“gmp.h”具有固定链接模式,与 GMP 构建参数配置相同。

/* Instantiated by configure. */
#if ! defined (__GMP_WITHIN_CONFIGURE)
    #define _LONG_LONG_LIMB 1
    #define __GMP_LIBGMP_DLL  0
#endif

与此一样,编译器永远不会生成静态对象装饰,因此链接器永远不会匹配静态 libgmp,我调整了定义 __GMP_LIBGMP_DLL

/* Added link switch GMP_STATIC */
#if ! defined (__GMP_WITHIN_CONFIGURE)
    #define _LONG_LONG_LIMB 1
    #ifndef GMP_STATIC // SGR 2021-12-30
        #define __GMP_LIBGMP_DLL  1
    #endif
#endif

现在,定义了GMP_STATIC,静态libgmp.a 被成功吸引,没有GMP_STATIC,动态libgmp.dll.a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多