今天在群里讨论一个问题,问题是从库链接器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呢?