/*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:
xxx-config除了--libs參数外另一个參数是--cflags用来生成头文件包括文件夹的。也就是-I參数,运行 mysql_config --cflags:
3、-include和-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
补充下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