gcc 笔记

    添加时间:2013-5-25 点击量:
    http://www.network-theory.co.uk/docs/gccintro/
    看了这个手册,懂得了一些gcc的相干常识,记录一下。
    1.
    gcc -Wall hello.c    
    gcc -Wall -g hello.c // 参加了调试信息,可以用gdb调试。
    2.
    gcc 默认搜刮的header file path is:
    /usr/local/include
    /usr/include
    默认搜刮的lib path is
    /usr/local/lib
    /usr/lib
    并且,在/usr/local/xxx中的文件,优先级要高于/usr/xxx
    可以应用
    `gcc -print-prog-name=cc1` -v
    `gcc -print-prog-name=cc1plus` -v
    来分别确认c++/c编译器查找header file的地位
     
    若是你的header file 和 lib 不在这几个处所。那就要用 -I -L来指定。
    -I 默示要找的header file 文件夹
    -L 默示要找的lib file 文件夹
    例: gcc -Wall -I/opt/gdbm-1.8.3/include -L/opt/gdbm-1.8.3/lib dbmain.c -lgdbm
     
     
    3.
    若是想要在shell里直接加载path,可以用C_INCLUDE_PATH(默示c) or CPLUS_INCLUDE_PATH(默示c++)
    LIBRARY_PATH默示lib path.
    like:
    ¥ C_INCLUDE_PATH=/opt/gdbm-1.8.3/include     // c++ 的话,就是:CPLUS_INCLUDE_PATH
    ¥ export C_INCLUDE_PATH

    ¥ LIBRARY_PATH=/opt/gdbm-1.8.3/lib
    ¥ export LIBRARY_PATH
     
    这些path的搜刮次序是:先搜刮用-I -L指定的,然后就是export进来的,最后才是/usr/local/xxx,最后是/usr/xxx
     
    4.
    可以应用:来区分include 或者 lib,如许就不消一次次指定。ex:
    ¥ C_INCLUDE_PATH=.:/opt/gdbm-1.8.3/include:/net/include
    ¥ LIBRARY_PATH=.:/opt/gdbm-1.8.3/lib:/net/lib
    For C++ programs, use the environment variable CPLUS_INCLUDE_PATH instead of C_INCLUDE_PATH.
    .默示当前目次
    若是要分隔写,就会很麻烦,上方的就要默示为:
    ¥ gcc -I. -I/opt/gdbm-1.8.3/include -I/net/include
       -L. -L/opt/gdbm-1.8.3/lib -L/net/lib .....
     
    5. 要加载某个动态库如libName.so,那要在编译时参加 -lName, gcc会主动在设定好的lib path找libName.so的文件,.so文件的优先级高于.a的静态库文件,若是要加静态库,那就要参加 -static, 如:
    ¥ gcc -Wall -static -I/opt/gdbm-1.8.3/include/ 
        -L/opt/gdbm-1.8.3/lib/ dbmain.c -lgdbm
     
    6. /etc/ld.so.conf 这个文件经管着加载so文件的路径
     
    7. 对于调试,有时法度会呈现core dumped,这时,你是多么的有一个core文件。起首要先在编译时参加-g选项。
    然后查看
    ¥ulimit -c
    0
    ¥ulimit -c unlimited
    ¥ulimit -c
    unlimited
    若是ulimit -c获得的是0,申明没有开启在core dumped时生成core文件。应用ulimit -c unlimited就可以解决。
    然后:
    ¥gdb a.out core
     
    8. how the compiler works
    (1)preprocessing(to expand macros)
    (2)compilation( source code to assembly language)
    (3)assembly( assembly language to machine code)
    (4)linking(to create the final executable)
     
    9. 当你知道的所有lib在号令行里了,然后还报undefined references错误,那就要重视是不是引用的次序了。如test.c里面要调用m.so里面的sqrt()办法。那在编译时,指令就要:
    ¥ gcc -Wall test.c -lm -o calc
    若是把 -lm 放到test.c前面,就会报undefined references错误了。因为在test.c里找不到sqrt()定义是,就会向后找。若是-lm放在前面,test.c天然就找不到了。
     
    10. 可以经由过程
    cpp -dM /dev/null
    查看所有在预编译器中定义的宏。
     
    11. 还是对于调试,有时会定义
    #ifdef TEST
    xxx
    #endif
    若是你想让这中心的代码履行,那就要
    gcc -DTEST test.c -o test
    就是参加-DXXX,XXX为定义的标签。
     
    12. 可以应用gprof进行机能测试。
     
    13. 履行文件的景象解析。让你知道
    ¥file a.out
    出来的信息默示什么。
    http://www.network-theory.co.uk/docs/gccintro/gccintro_89.html
     
    14.
    ¥ldd a.out
    获得可履行文件所引用的动态库。
     
    原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
    分享到: