代码改变世界

GCC LD_LIBRARY_PATH 和 LIBRARY_PATH

2012-11-28 08:25  respawn  阅读(6102)  评论(1编辑  收藏  举报

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