【问题标题】:Undefined reference to `__gmpz and makefile对 `__gmpz 和 makefile 的未定义引用
【发布时间】:2018-03-16 20:58:37
【问题描述】:

我不知道为什么会出现这些编译错误:

gcc -o Compil obj/MillerRabin.o obj/main.o -L. -L/usr/lib/ -Wl,-rpath=/home/---------/Documents/AC20_Cyrpto -lgmp  -lCommon  -ltest  -lprimeGen
./libtest.so: undefined reference to `__gmpz_set_str'
./libtest.so: undefined reference to `__gmpz_set_ui'
./libtest.so: undefined reference to `__gmpz_add_ui'
./libtest.so: undefined reference to `__gmpz_clear'
./libtest.so: undefined reference to `__gmpz_init'
./libtest.so: undefined reference to `mpzPrint'
collect2: error: ld returned 1 exit status
Makefile:61: recipe for target 'Compil' failed
make: *** [Compil] Error 1

这些错误来自libs/test/test.c,我使用的是我朋友制作的 make 文件,我还没有真正研究它们是如何工作的。

奇怪的是,在我的 libs 文件夹中,我还有另一个使用 gmp 的 .c 文件(libs/Common/common.hmpzfunctions.c),而且那个文件没有给我任何错误。如果我将我的测试函数移到主函数,则编译工作正常。

如果有人知道如何解决这个问题,那就太好了!谢谢。

【问题讨论】:

    标签: c makefile compilation undefined


    【解决方案1】:

    库中的符号按顺序应用。所以当你写的时候:

    -lgmp -ltest
    

    这意味着 libgmp 中使用的符号将在 libtest 中查找,反之则不行。

    显然,您的 libtest 需要来自 libgmp 的函数,因此您需要以相反的顺序应用它们。

    根据经验,外部库应始终放在最后,因为它们通常不需要您库中的符号。

    所以在不知道太多的情况下,我猜顺序应该是:

     -lCommon -lprimeGen -ltest -lgmp
    

    在我看来,您可能想从LINK_FLAGS 中删除-lgmp 并以某种方式将其添加到链接命令的末尾。

    【讨论】:

    • 您好,感谢您的回复,虽然我在使用 make 文件方面没有很多经验,但我会看看我该怎么做。
    • @Gambon:这个看起来不太糟糕。一个快速而肮脏的解决方法是从 LINK_FLAGS 的定义中删除 -lgmp 并将其添加到 LIBS_LINK 定义的末尾(前面有一个空格)
    • 所以解决了问题的一部分,gmp 没有给我任何错误,但我仍然使用我编写的 mpzPrint 函数的最后一个错误。
    • @gambon:这可能是同一个问题,但你必须弄清楚它在哪里。该函数用于哪个库/ies?它定义在哪个图书馆?请记住:在链接命令中,仅查找已提及的符号的定义。
    • 库之间的符号依赖关系通常很烦人,并且通常难以自动构建-l 选项列表。我只会手动定义LIBS_LINK,而不是试图变得聪明;如果您向项目添加另一个库,则必须更改它,但它确实允许您根据需要调整顺序。 (顺便说一下,这个变量的常用名称是LDLIBS。但对此没有规定。)
    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多