1. 程式人生 > >linux:gcc編譯error:“collect2: ld returned 1 exit status” (Undefined reference )

linux:gcc編譯error:“collect2: ld returned 1 exit status” (Undefined reference )

在linux環境下編譯一個工程,不管怎樣編譯,總是出現以下錯誤:

-bash-4.1$ gcc test.c consumers_producers.c
/tmp/ccQzS4PV.o: In function `main':
test.c:(.text+0x92): undefined reference to `pthread_create'
test.c:(.text+0xf2): undefined reference to `pthread_create'
test.c:(.text+0x123): undefined reference to `pthread_join'
collect2: ld returned 1 exit status

Undefined reference to 錯誤:

這類錯誤是在連結過程中出現的,可能有兩種原因∶
一是使用者自己定義的函式或者全域性變數所在原始碼檔案,沒有被編譯、連結,或者乾脆還沒有定義,這 需要使用者根據實際情況修改源程式,給出全域性變數或者函式的定義體;
二是未定義的符號是一個標準的庫函式,在源程式中使用了該庫函式,而連結過程中還沒有 給定相應的函式庫的名稱,或者是該檔案庫的目錄名稱有問題

出現此種錯誤,表示你的程式碼應該是沒有問題的
經過作者我多番查詢,才找出了原因,如下:

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const
pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); Compile and link with -pthread.

最重要的是這句話:

故在使用gcc編譯的時候應該是:gcc xxx -pthread
一定要加上“-lpthread”,這樣才可以編譯通過
在上面的例子中:

應該是: gcc test.c consumers_producers.c -pthread

相關推薦

linuxgcc編譯errorcollect2: ld returned 1 exit status” (Undefined reference

在linux環境下編譯一個工程,不管怎樣編譯,總是出現以下錯誤: -bash-4.1$ gcc test.c consumers_producers.c /tmp/ccQzS4PV.o: In function `main': test.c:(.text+

編譯器錯誤/tmp/ccyOgqYQ.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status

今天下午在編寫一個c程式檔案檔名:test.cpp, 檔案內容見附錄。使用gcc編譯的時候出現/tmp/ccyOgqYQ.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: l

關於qt error collect2 ld returned 1 exit status的錯誤

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

/usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err

usr 方法 pos track data- -m stat cgi error /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cg

QT5執行hello GUI遇到** cannot find -lGL** collect2: error: ld returned 1 exit status問題

執行環境:Qt Creator 4.5.0 Based on Qt 5.9.4 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit) Ubuntu16.04中執行最簡單的hello程式,按照通用的教程將程式執行後 ,出現標題問題,百度

||error: ld returned 1 exit status| C++編譯時的問題

今天在用code::blocks寫C++時,遇到了||error: ld returned 1 exit status|,問題 搜了很多文章都不明白,最後看到有人說 Devc++中出現此問題,是由於連結使用make和編譯器(MinGw)中的連結(link)衝突導致的。突然想到了之前在工程中建

對‘sqrt’未定義的引用 collect2: error: ld returned 1 exit status

今天在呼叫數學庫函式的時候,在Linux中使用的編譯器中出現: /tmp/ccmfxE8L.o:在函式‘main’中: testcgen.c:(.text+0x23):對‘sqrt’未定義的引用 co

error: ld returned 1 exit status

fig 2.4 undefine 一個 去哪裏 安裝 ini set col [email protected]5437:~/Downloads/LBD_Descriptor/build$ cmake .. -- Configuring done -- Gene

linux系統應用編譯構建make 、 make all 、 make clean 、 make install 區別

make,僅編譯; make install,編譯並安裝(比如安裝到/usr/bin目錄下,然後可以直接使用。因為/usr/bin只有管理員才能向裡面新增檔案,所以通常要加sudo) 這個要看你的Makefile的,約定俗成的而已 一般"潛規則" make就是make all,編譯用的,具

解決Ubuntu編譯errorfatal error: sys/cdefs.h: No such file or directory

64位的Ubuntu如果執行X86平臺32位編譯,gcc -m32 -o x  x.c會報錯:fatal error: sys/cdefs.h: No such file or directory 解

gcc編譯選項c++11 多執行緒編譯

c++11原生支援多執行緒程式設計,如下程式碼(假設檔名為test.cpp): #include <iostream> #include <future> using namespace std; int main() {  auto fr0 =

linuxgcc編譯 .c檔案生成動態連結庫 .so檔案,並測試呼叫該連結庫

簡單介紹:linux中so檔案為共享庫,和windows下dll相似;so可以共多個程序呼叫,不同程序呼叫同一個so檔案,所使用so檔案不同;so原檔案不需要main函式;例項,1.通過mysqlTest.c中的函式mysql(),生成一個libmysql.so連結庫#inc

Navicat for mysql 1130錯誤 用Navicat連線遠端MYSQL報錯ERROR 1130: Host '192.168.1.3' is not allowed to connec

Navicat for mysql 1130錯誤 用Navicat連線遠端MYSQL,提示如下錯誤,我以為是自己的防火牆問題,但是關了,依然不行。  我認為這段英文,有點誤導,讓人感覺是自己這邊出了問題。  看解決方法吧  ERROR 1130: Host '192.168.1.3' is not allo

ARP報文的傳送與接收(Linuxgcc編譯

ARP報文的傳送與接收 這篇文章主要是關於ARP報文的傳送與接收,學習TCP/IP協議,還是多動手做一些測試對協議的理解比較深刻,所以自己寫了一份比較簡單的關於ARP的原始碼, 主要是起到記錄作用,方便以後回顧,當然,如果有大俠能提出問題,幫助我改進缺點是萬

【ndk】直接使用ndk提供的arm-linux-androideabi-gcc編譯android可執行程式

1、背景 經常使用linux交叉工具類的朋友都知道,在已安裝交叉編譯工具鏈後要交叉編譯得到linux可執行檔案只需要執行如下類似的命令(如編譯hello.c生成hello可執行檔案): arm-linux-gcc hello.c -o hellohello.c的程式碼非常

Linuxgcc編譯生成動態連結庫*.so檔案並呼叫它

動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。1、動態庫的編譯下面通過一個例子來介紹如何生成一個動態庫。這裡

LinuxGCC 編譯時如何指定連結庫

-l引數和-L引數 -l引數就是用來指定程式要連結的庫,-l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了。當我們自已要用到一個第三方提供的庫名字libtest.so,那麼我們只要把lib

linuxGCC編譯C程式(一)

GCC的"-lm"選項,它告訴GCC檢視系統提供的數學庫(libm)。因為Linux和UNIX的系統函式庫通常以"lib"為字首,所以我們假設它存在。真正的函式庫位置隨系統的不同而不同,但它一般會位於目錄/lib或/usr/lib中,在這些目錄中還有數以百計的其他必需的系統函式庫。 4. 共享函式庫與靜態函

交叉編譯工具鏈-及arm-linux-androideabi-gcc編譯方法

一、編譯器:      就是將“高階語言”翻譯為“機器語言(低階語言)”的程式。一個現代編譯器的主要工作流程:原始碼 (source code) → 前處理器 (preprocessor) → 編譯器 (compiler) → 彙編程式 (assembler) →

OpenCV ARM移植(交叉編譯opencv) arm-oe-linux-gnueabi-gcc編譯opencv3.1.0

 Cmake的安裝 OpenCV 2.2以後版本需要使用Cmake生成makefile檔案,因此需要先安裝cmake。 ubuntu下安裝cmake比較簡單, apt-get install cmake 如果覺得自帶的版本不符合要求,可以下載安裝包。 下載最新版的安裝