GCC LD_LIBRARY_PATH 和 LIBRARY_PATH


今天在群里討論一個問題,問題是從庫鏈接器ld開始的.

 

Example:

當我們在使用POSIX Thread的時候,只要在編譯的時候加上-lpthread選項就可以了.這是因為POSIX Thread就在LIBRARY PATH中,

關於這點,可以通過gcc --print-search-dir來驗證.

1 respawn@respawn-F83VF:~$ gcc --print-search-dir
2 安裝:/usr/lib/gcc/i686-linux-gnu/4.6/
3 程序:=/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/http://www.cnblogs.com/i686-linux-gnu/bin/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/http://www.cnblogs.com/i686-linux-gnu/bin/i386-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/http://www.cnblogs.com/i686-linux-gnu/bin/
4 庫:=/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/http://www.cnblogs.com/i686-linux-gnu/lib/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/http://www.cnblogs.com/i686-linux-gnu/lib/i386-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/http://www.cnblogs.com/i686-linux-gnu/lib/../lib/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/../i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/../i386-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/http://www.cnblogs.com/lib/:/lib/i686-linux-gnu/4.6/:/lib/i386-linux-gnu/:/lib/../lib/:/usr/lib/i686-linux-gnu/4.6/:/usr/lib/i386-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/http://www.cnblogs.com/i686-linux-gnu/lib/:/usr/lib/gcc/i686-linux-gnu/4.6/http://www.cnblogs.com/../:/lib/:/usr/lib/

 

而在使用nvidia cuda的時候,按照官方的文檔,需要為當前用戶或跟用戶配置一個環境變量:

1 #cuda
2 export PATH=/usr/local/cuda-5.0/bin:$PATH
3 export LD_LIBRARY_PATH=/usr/local/cuda-5.0/lib:$LD_LIBRARY_PATH   // LD_LIBRARY_PATH

 

那么如果使用下面的方式編譯會出現什么情況?

1 gcc ... ... -lcudart

 

 首先,需要說明的一點是,這里是使用gcc去編譯,而不是nvcc.其次,這樣子編譯肯定是通不過的.為什么?

 LIBRARY_PATH:   gcc build time environment parm. 就是gcc編譯期的環境變量,指定庫路徑.

 LD_LIBRARY_PATH: gcc runtime environment parm. gcc運行期的環境變量,.....

 

gcc在build time的時候是不會去搜索LD_LIBRARY_PATH的,所以它根本就找不到libcudart,(當然,如果你使用-L library_path也行).

 

不過,這樣子的問題我們也是很少會遇到的,除非是做一些新技術開發的,像GPU,由於還不健全的開發模式就會導致這種問題的出現.

 

另外,有位群友問我一個cuda+f90+c的makefile問題,然后問我是怎么理解makefile的.

我想,我對這方面還沒有什么深入的理解,但是也可以簡單的說說自己的想法:

makefile是一個project的組織文件,從makefile就可以了解一個項目的源碼組織情況.而makefile終究只是個構建項目的中間工具,同樣

我也可以說成熟的ide也是項目的構建工具,只不過是二者的層次不一樣,但是又有什么區別呢? 對makefile的理解,要聯系到對編譯鏈接的理解,

有的時候還要結合特定平台和編譯器,再加上一些腳本的知識.

有了這些基礎知識,閱讀makefile就應該沒有什么壓力了,但是要想自己手寫一個項目的makefile的話,還是需要時間積累的.我做不到.當然,

如果你說使用autotools,CMake這樣子也算是的話,那我還是只能說:我懂一點.

不過,現在又有多少人會選擇手寫makefile呢?

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM