GCC编译归纳总结

    xiaoxiao2023-03-24  5

    概述

    一般在做项目的时候,都忽略了这个步骤,因为makefile是别人写好的,自己只要执行make操作就ok了,

    但是真正的项目开发,需要程序员有这项基本技能。

    弄明白gcc/g++编译器的基本参数和使用方法,在编译make出错后会有很大的帮助。

     

    GCC使用心得

    一个最为基本的工程,包含一个头文件.h和一个实现文件.c,还有一个测试文件test.cpp。

    那么如何让这测试文件能顺利编译?

    比如,现在在编写一个关于string类,那么会有String.h和String.c这2个文件,最后需要有一个测试文件test_string.cpp

    那么如何编译这个测试文件呢?

     

    小工具

    1、查看Gcc默认查找的目录

    gcc –print-search-dirs

    Gcc编译器,会在搜索路径下,查找共享库,若存在,则链接它。

    若不存在,则查找静态库,若只想链接静态库,可以指定-static选项

    共享库:链接时只是指定了动态链接器和程序所需的库文件,没有做真的链接,在运行时做动态链接;

    静态库:链接器把静态库中的目录文件取出来和可执行文件真正链接到一起

     

    gcc –c xx.c

    只编译或者汇编源文件,但是不链接

     

    2、如何编译出共享库

    gcc -c -g -fPIC stack/stack.c stack/push.cstack/pop.c stack/is_empty.c gcc -shared -o libstack.so stack.o push.opop.o is_empty.o gcc main.c -g -L. -lstack -Istack -o main

    3、查看可执行文件依赖哪些库

    Ldd /usr/lib64/librados.so.2.0.0.0 [root@lab205 ~]# ldd/usr/lib64/librados.so.2.0.0 linux-vdso.so.1 => (0x00007ffff012c000) libssl3.so => /usr/lib64/libssl3.so (0x0000003036000000) libsmime3.so => /usr/lib64/libsmime3.so (0x0000003035c00000) libnss3.so => /usr/lib64/libnss3.so (0x0000003035000000) libnssutil3.so =>/usr/lib64/libnssutil3.so (0x0000003034000000) libplds4.so => /lib64/libplds4.so (0x0000003033800000) libplc4.so => /lib64/libplc4.so (0x0000003033c00000) libnspr4.so => /lib64/libnspr4.so (0x0000003034400000) libpthread.so.0 =>/lib64/libpthread.so.0 (0x0000003030c00000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003031000000) libuuid.so.1 => /lib64/libuuid.so.1 (0x0000003035400000) libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000003036400000) librt.so.1 => /lib64/librt.so.1 (0x0000003031400000) libboost_thread-mt.so.5 => /usr/lib64/libboost_thread-mt.so.5(0x00000030c8200000) libboost_system-mt.so.5 => /usr/lib64/libboost_system-mt.so.5(0x00000030c8e00000) libleveldb.so.1 =>/usr/lib64/libleveldb.so.1 (0x00000030c8600000) libsnappy.so.1 => /usr/lib64/libsnappy.so.1 (0x00000030c8a00000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000030c3e00000) libm.so.6 => /lib64/libm.so.6 (0x0000003031800000) libc.so.6 => /lib64/libc.so.6 (0x0000003030800000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000030c4600000) libz.so.1 => /lib64/libz.so.1 (0x0000003031c00000) /lib64/ld-linux-x86-64.so.2 (0x0000003030000000)

     

    4、共享库的搜索路径由动态链接器指定

    man ld.so

    查找顺序如下

    A、 LD_LIBRARY_PATH (不建议修改) B、 从缓存文件/etc/ld.so.cache中查找,涉及到ldconfig命令 (常用的方法) 修改/etc/ld.so.conf文件,加入共享库的路径,然后运行Ldconfig –v查看 C、 从/usr/lib、/lib中查找

    把共享库文件拷贝到/usr/lib或/lib下便于查找

    5、共享库命名

    Real name 共享库真实名称,比如/usr/lib64/librados.so.2.0.0,包含完整的共享库版本号

    Soname 符号链接的名字,只包含共享库的主版本号,如/usr/lib64/librados.so.2-> librados.so.2.0.0,

    根据soname决定使用哪个共享库,可以方便升级。比如,有的应用程序依赖librados.so.1,有的依赖librados.so.2,

    那么使用librados.so.1,真正的库文件不管是librados.so.1.0.1还是librados.so.1.0.2都可以用。

    Linker name 在编译链接时使用,/usr/lib64/librados.so-> /usr/lib64/librados.so.2.0.0,因为编译器只认linker name,所以如果删除了/usr/lib64/librados.so但是/usr/lib64/librados.so.2存在,仍然无法通过编译,编译器会报错:找不到共享库。

     

    gcc的编译优化选项有-O0、-O、-O1、-O2、-O3、-Os几种。-O0表示不优化,这是缺省的选项。

    -O1、-O2和-O3这几个选项一个比一个优化得更多,编译时间也更长。

    -O和-O1相同。-Os表示为缩小目标代码尺寸而优化。

     

    转载请注明原文地址: https://ju.6miu.com/read-1201191.html
    最新回复(0)