• 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呢?

     

     

     
  • 相关阅读:
    js调试技巧
    Java编程技巧——构建器
    java设计模式:工厂方法模式(Factory Method)
    23种设计模式导航
    java设计模式:单例模式(Singleton Pattern)
    迭代器与生成器
    装饰器
    文件操作的说明与使用
    函数命名、调用小技巧
    各类型数据的操作方法
  • 原文地址:https://www.cnblogs.com/respawn/p/2789733.html
Copyright © 2020-2023  润新知