gcc - 编译错误gcc -lpthread位置

标签 gcc compiler-construction compiler-errors linker position

这项工作:

    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

哪个不起作用。

有任何想法吗?

PS:我正在使用gcc 4.6.3/Ubuntu 12.04

最佳答案

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

问题实际上与您的命令行无关,而是GNU ld的问题。 GNU ld在遇到-lXXX选项时,读取libXXX.solibXXX.a定义的所有符号,检查在命令行中-lXXX选项之前指定的文件中是否提到了这些符号,而忽略了其余的符号符号。

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

当计算机的内存确实有限时,这可能是合理的,但如今,它只是很长一段时间以来被遗忘的傻东西,应该早就已经解决了。

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

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

为了更加合理,在链接和编译与pthread相关的程序时,请同时使用-pthread

关于gcc - 编译错误gcc -lpthread位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20731220/

相关文章:

linux - fatal error : pthread/pthread_impl. h : No such file or directory #include <pthread/pthread_impl. h>

c++ - 编译后的静态可执行文件返回 "no such file or directory"

javascript - 此语法是否通过右递归定义右结合性

编译器无法捕获条件 block 中的变量重新定义

compiler-construction - lex 使用来自 lex.yy.c 文件的 flex -gettin 输出

c - IMAGE_REL_AMD64_ADDR64 64 位重定位

c - 为什么编译器会提示这个 `sprintf` 参数?

scala - Scala map 转换问题: type mistmatch

ubuntu - 将 OpenCL.so 库添加到 makefile,我收到错误 "undefined reference to"

c - 在 Makefiles GCC C 程序中,什么是 .d 文件,什么是通配符?