1. 程式人生 > >ubuntu 下沒有pthread庫以及報undefined reference to 'pthread_create'的解決方法

ubuntu 下沒有pthread庫以及報undefined reference to 'pthread_create'的解決方法

最近在Ubuntu下編譯一個程式,需要使用多執行緒庫pthread,但是編譯時總是提示“undefined reference to 'pthread_create'”的錯誤,如下圖所示:


要解決這個問題非常簡單 。先說怎麼解決。

如果你使用的是gcc編譯,或者將編譯命令都寫到makefile檔案中了,例如我的makefile檔案為:

all:
	gcc -g -Wall   -I/usr/local/include -o transmitter transmitter.c IniFileRW.c  -lpthread 
	
clean:
	rm -rf *.o transmitter
那麼這時候只要在最後面加上-lpthread就可以了,而且在redhat5中-lpthread可以加在-Wall的後面,但是在Ubuntu下必須加在最後才行。

如果你用的是eclipse,並makefile是由eclipse自動生成的,那麼你要在eclipse下配置一下。方法是右擊eclipse工程檔案,選擇屬性->C/C++Setting->在右側欄中選擇“tool Settings”->GCC linker->在library中做如下設定,然後重新編譯就行了。

如果上面的方法還是不起作用,可能是你的系統的動態庫有問題。這時候需要配置系統庫了。且聽我慢慢道來。

一般 Linux 系統把 /lib 和 /usr/lib 兩個目錄作為預設的庫搜尋路徑,所以使用這兩個目錄中的庫時不需要進行設定搜尋路徑即可直接使用。對於處於預設庫搜尋路徑之外的庫,需要將庫的位置新增到 庫的搜尋路徑之中。在系統的lib目錄下是有thread共享庫檔案的。在早期的Ubuntu系統中,lib只要設定/lib和/usr/lib就可以了,但是Ubuntu14中, lib庫的分類明顯多了,主要是區分32位和64位的庫。在/etc/ld.so.conf.d下可以看到幾個與共享庫有關的配置檔案。例如i686-linux-gnu.conf檔案的內容為:

/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu
/lib/i686-linux-gnu
/usr/lib/i686-linux-gnu
其中i386和i686都是32位系統的,而x86_64是64位系統的。開啟x86_64-linux-gnu.conf可以看到裡面的內容為:
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
很明顯,這裡是將32位和64位系統的檔案進行了區分。如果在eclipse下編譯遇到找上面的問題,就需要手動指定路徑了。

為了解決undefined reference to “pthread_create“的問題,一般有三種方法:

第一種:檢查共享庫配置檔案.檢查/etc/ld.so.conf.d下對應的檔案是否將共享庫的路徑加入進來,如果沒有就加上。 還要使用 /sbin/ldconfig命令來更新一下/etc/ld.so.cache 檔案。

第二種:設定環境變數 LD_LIBRARY_PATH ,方法是: export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH(紅色部分修改成你所指定的路徑) 可以用下面的命令檢視 LD_LIBRAY_PATH 的設定內容:
echo $LD_LIBRARY_PATH
最近沒有自己寫共享庫,所以上述兩種方法我沒有驗證過。一般而言,為了管理方便,我們會將自己寫的程式編譯到/usr/local/下,這時候系統是找不到的,必須通過上述方法來設定。 第三種:直接在編譯時指定,命令是在gcc時加上 -L/usr/local/lib,而在eclipse中,可以按照上面圖示直接新增進來。不過以前使用openssl進行該操作時,編譯能生成可執行程式,執行時還是會提示找不到共享庫,所以還是前面兩個方法要好一些。 第四種:前面說了,Ubuntu能自動檢索/usr/lib和/lib目錄,直接將你的共享庫編譯到其中一個目錄下就行了。不過在開發過程中建議不要這麼做,不然自己都會亂。