今天在群里討論一個問題,問題是從庫鏈接器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呢?