• gcc參数总结


    /*gcc 命令总结*/
    补充下gcc的知识,免得被大自然说编译原理不行..

    1、-o 參数

    參数说明: -o參数用来指定生成程序的名字

    gcc test.c 会编译出一个名为a.out的程序
    gcc test.c -o test 编译出一个名为test的程序

    2、-l參数和-L參数


    參数说明: -l參数就是用来指定程序要链接的库。-l參数紧接着就是库名,比方。我要链接到数学库。它的库名是m。它的库文件名称是libm.so(一般放在/lib、/usr/lib/usr/local/lib文件夹下),非常easy看出,把库文件名称的头lib和尾.so去掉就是库名了

    放在/lib和/usr/lib和/usr/local/lib里的库直接用-l參数就能链接了,但假设库文件没放在这三个文件夹里,而是放在其它文件夹里,这时我们仅仅用-l參数的话。链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”。也就是链接程序ld在那3个文件夹里找不到libxxx.so。这时另外一个參数-L就派上用场了。比方经常使用的X11的库。它在/usr/X11R6/lib文件夹下,我们编译时就要用-L/usr/X11R6/lib -lX11參数,-L參数跟着的是库文件所在的文件夹名。再比方我们把libtest.so放在/aaa/bbb/ccc文件夹下,那链接參数就是-L /aaa/bbb/ccc -ltest


    手工来写链接參数总是非常麻烦的,还好非常多库开发包提供了生成链接參数的程序。名字一般叫xxxx-config,一般放在/usr/bin文件夹下,比方, mysql的链接參数生成程序是mysql_config(注意下划线。这个比較特殊),运行mysql_config --libs:
    -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl 
    这些就是mysql须要的链接參数,执行命令自己主动生成。多简单省事。


    xxx-config除了--libs參数外另一个參数是--cflags用来生成头文件包括文件夹的。也就是-I參数,运行 mysql_config --cflags:
    -I/usr/include/mysql -DBIG_JOINS=1  -fno-strict-aliasing  -g
    这就是mysql须要的头文件包括文件夹

    如今的问题就是如何用这些输出结果了,最直接的方法就是复制粘贴或者照抄。更好的办法是在编译命令行里增加这个`xxxx-config --libs --cflags`,比方编译一个mysql程序:gcc mysql.c `mysql_config --libs --cflags`

    就OK了(我前几天的博客里提到过这个问题。^_^


    3、-include和-I參数

    參数说明: -include用来包括头文件,但普通情况下包括头文件都在源代码里用#include xxxxxx实现,-include參数非常少用。

           -I參数是用来指定头文件文件夹,/usr/include文件夹通常是不用指定的,gcc知道去那里找,可是假设头文件不在/usr/include里我们就要用-I參数指定了。比方头文件放在/myinclude目录里,那编译命令行就要加上-I /myinclude參数了,假设不加你会得到一个"xxxx.h: No such file or directory"的错误。-I參数能够用相对路径,比方头文件在当前文件夹,能够用-I.来指定。上面我们提到的--cflags參数就是用来生成-I 參数的


    4、-O參数

    參数说明: 这是一个程序优化參数,一般用-O2就是。用来优化程序用的,比方gcc test.c -O2,优化得到的程序比没优化的要小,运行速度可能也有所提高

    5、-shared參数

    參数说明: 编译动态库时要用到,比方gcc -shared test.c -o libtest.so

    6、几个相关的环境变量(用cmake时须要)

    PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径。默认是/usr/lib/pkgconf
    ig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs參数和Cflags參数等等。
    CC:用来指定c编译器
    CXX:用来指定cxx编译器
    LIBS:跟上面的--libs作用几乎相同
    CFLAGS:跟上面的--cflags作用几乎相同
    CC,CXX,LIBS。CFLAGS手动编译时一般用不上。在做configure时有时用到,普通情况
    下不用管
    环境变量设定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx


    7、參考:http://wenku.baidu.com/view/655f48b91a37f111f1855b36.html


  • 相关阅读:
    Python LED
    vmvare虚拟机经验
    Debian系统简要说明
    Android onclick监听事件打开新界面
    在国外搭个人服务器(顺便访问外网)
    生成指定时间内的 随机日起
    生成指定时间内的日期
    Mac 上查找javahome
    java 学习的网站
    Java 线程
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6919838.html
Copyright © 2020-2023  润新知