【问题标题】:Compile error gcc -lpthread position编译错误 gcc -lpthread 位置
【发布时间】:2013-12-22 15:59:15
【问题描述】:

这项工作:

    gcc a.o b.o -o a -lpthread

这不起作用:

    gcc -lpthread a.o b.o -o a

并显示一些类似这样的错误:

undefined reference to `pthread_create'

所以当我使用 Makefile 编译时,它会生成

    gcc -lpthread a.o b.o -o a

这不起作用。

有什么想法吗?

P.S:我使用的是 gcc 4.6.3/Ubuntu 12.04

【问题讨论】:

    标签: gcc compiler-construction compiler-errors linker position


    【解决方案1】:

    首先,在使用 pthread 编译时,您希望使用 -pthread,而不是 -lpthread - -pthread 可能会启用程序在多线程环境中工作所需的一些编译时选项。

    问题不在于您的命令行,而是 GNU ld 的问题。 GNU ld,在遇到-lXXX 选项时,读取libXXX.solibXXX.a 定义的所有符号,检查在-lXXX 之前指定的文件中是否提到了这些符号中的任何一个命令行中的选项,而忘记了其余的符号。

    换句话说:目标文件和库的命令行顺序会改变链接器的行为。

    当计算机的内存真的有限时,这可能是合理的,但现在它只是很久以前被遗忘的愚蠢的人工制品,应该在一段时间前就已经修复了。

    当然,与定义相同符号的多个库链接可能会出现问题,但肯定有更明智的方法来允许此类情况下的预期行为。


    底线:对于 GNU ld(由 gcc 调用),只有您问题中的第一个命令有效,因为 ld 仍然存在于之前的计算时代。

    为了更加清醒,在链接编译你的pthread相关程序时都使用-pthread

    【讨论】:

    • 谢谢哥们。更改为 -pthread 后,无论选项位置如何,它都可以工作。
    • 我猜-pthread 添加了一个特殊情况来链接它。这证明了我的观点,即现在期权订单不再好。
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2017-06-27
    相关资源
    最近更新 更多