gcc 命令行详解

来源:互联网 发布:义乌淘宝摄影青岩刘 编辑:程序博客网 时间:2024/05/14 17:47

1gcc包含的c/c++编译

gccccc++g++
gcc
cc是一的,c++g++是一的,一般c程序就用gcc编译c++程序就用g++编译

2gcc的基本用法

gcc test.c这样编译出一个名a.out的程序
gcc test.c -o test
这样编译出一个名test的程序
-o
参数用来指定生成程序的名字

3会出undefined reference to 'xxxxx'错误

首先错误,不是编译错误,也就是如果只有错误明你的程序源本身没有问题,是你用编译编译时参数用得不,你没有指定接程序 要用到得,比如你的程序里用到了一些数学函数,那你就要在编译参数里指定程序要接数学,方法是在编译命令行里加入-lm

4-l参数和-L参数

-l参数就是用来指定程序要接的-l参数接着就是名,那么库名跟真正的文件名有什么关系呢?就拿数学,他的名是m,他的文件名是libm.so,很容易看出,把文件名的lib和尾.so去掉就是名了

好了在我知道怎得到名,当我自已要用到一个第三方提供的名字libtest.so,那只要把libtest.so /usr/lib里,编译时加上-ltest参数,我就能用上libtest.so了(当然要用libtest.so里的函数,我们还需要与 libtest.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

另外,大部分libxxxx.so只是一个接,以RH9例,比如libm.so接到/lib/libm.so.x/lib/libm.so.6接到/lib/libm-2.3.2.so,如果没有这样接,是会出,因ld只会找libxxxx.so,所以如果你要用到xxxx,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个接就可以了
ln -s libxxxx-x.x.x.so libxxxx.so

手工来写接参数是很麻的,好很多库开发包提供了生成接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin下,比如gtk1.2接参数生成程序是gtk-configgtk-config --libs就能得到以下"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic

-lgmodule -lglib -ldl -lXi -lXext -lX11 -lm"就是编译一个gtk1.2程序所需的gtk接参数,xxx-config除了--libs参数外有一个参数是--cflags用来生成文件包含目的,也就是-I参数,在下面我将会到。你可以试试执gtk-config --libs --cflags,看看

在的问题就是怎果了,最笨的方法就是制粘或者照抄,明的
法是在编译命令行里加入`xxxx-config --libs --cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样就差不多了。注意`不是引号,而是1那个

除了xxx-config以外,在新的开发包一般都用pkg-config来生成接参数,使用方法跟xxx-config似,但 xxx-config针对特定的开发包,但pkg-config包含很多开发包的接参数的生成,用pkg- config --list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg -config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all里列出名中的一个,比如gtk1.2的名字就是gtk+ pkg-

config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一的。比如:
gcc gtktest.c `pkg-config gtk+ --libs --cflags`


5
-include-I参数

-include用来包含文件,但一般情况下包含文件都在源里用#i nclude xxxxxx实现-include参数很少用。-I参数是用来指定文件目/usr/include一般是不用指定的,gcc知道去那里找,但 是如果文件不在/usr/include里我就要用-I参数指定了,比如文件放在/myinclude里,那编译命令行就要加上- I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"错误-I参数可以用相路径,比如文件在当前目,可以用-I.来指定。上面我提到的--cflags参数就是用来生成-I 参数的

6-O参数

是一个程序化参数,一般用-O2就是,用来化程序用的,比如gcc test.c -O2化得到的程序比没化的要小,行速度可能也有所提高

7-shared参数
编译动态库时要用到,比如gcc -shared test.c -o libtest.so

8、几个相
PKG_CONFIG_PATH
:用来指定pkg-config用到的pc文件的路径,默/usr/lib/pkgconf
ig
pc文件是文本文件,展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。

CC
:用来指定c编译
CXX
:用来指定cxx编译
LIBS
:跟上面的--libs作用差不多
CFLAGS:
跟上面的--cflags作用差不多
CC
CXXLIBSCFLAGS动编译时一般用不上,在做configure用到,一般情况下不用管

定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx

9于交叉编译

交叉编译通俗地就是在一平台上编译出能运行在体系构不同的另一平台上,比如在我PC平台(X86 CPU)编译出能运行在sparc CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必放到sparc CPU平台上才能运行。当然两个平台用的都是linux这种方法在异平台移植和嵌入式开发时用得非常普遍

与交叉编译,我平常做的编译就叫本地编译,也就是在当前平台编译编译得到的程序也是在本地

用来编译这种程序的编译器就叫交叉编译器,相,用来做本地编译的就叫本地编译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器是不一的,需要在编译gcc用特定的configure参数才能得到支持交叉编译gcc

了不跟本地编译器混淆,交叉编译器的名字一般都有前,比如sparc-xxxx-linux-gn
u-gcc
sparc-xxxx-linux-gnu-g++ 等等

10、交叉编译器的使用方法
使用方法跟本地的gcc差不多,但有一点特殊的是:必-L-I参数指定编译器用sparc文件,不能用本地(X86)文件有可以用本地的)

例子:
sparc-xxxx-linux-gnu-gcc test.c -L/path/to/sparcLib -I/path/to/sparcInclude

gccg++

Linux
中最重要的开发工具是 GCCGCC GNU C C++ 编译器。实际上,GCC 够编译种语言:CC++ Object CC 言的一面向展)。利用 gcc 命令可同时编译 C C++ 源程序。

GCC
可同用来编译 C 程序和 C++ 程序。一般来C 编译器通源文件的后名来判断是 C 程序 C++ 程序。在 Linux 中,C 源文件的后 .c,而 C++ 源文件的后 .C .cpp

gcc
命令只能编译 C++ 源文件,而不能自 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译接,程序会自动调 gcc 实现编译

选项
-ansi
只支持 ANSI 准的 C 法。选项将禁止 GNU C 的某些特色,
例如 asm typeof 关键词
-c
编译并生成目文件。
-DMACRO
以字符串“1” MACRO 宏。
-DMACRO=DEFN
以字符串“DEFN” MACRO 宏。
-E
只运行 C 预编译器。
-g
生成调试信息。GNU 调试器可利用信息。
-IDIRECTORY
指定外的文件搜索路径DIRECTORY
-LDIRECTORY
指定外的函数搜索路径DIRECTORY
-lLIBRARY
搜索指定的函数LIBRARY
-m486
针对 486 行代码优化。
-o FILE
生成指定的出文件。用在生成可行文件
-O0
理。
-O
-O1 化生成代
-O2
步优化。
-O3
-O2 步优化,包括 inline 函数。
-shared
生成共享目文件。通常用在建立共享库时
-static
禁止使用共享接。
-UMACRO
取消 MACRO 宏的定
-w 不生成任何警告信息。
-Wall
生成所有警告信息。


GNU 调试器称 gdb

由于目越来越大,也增加了目管理的度。在开发组中,个成都要保留一个副本,在开发中非常容易引起冲突。CVS 就是了解决问题的。

a
、修改同,防止一名开发的修改覆盖其他人的成果。(check outread only

b
维护不同的版本。(按 version 找)

c
、可记录。防止 bug 的再引入。(diff

CVS
了解决问题,采用的方式是:

开发员对源代码进行修改,修改的内容被登check in)到了 CVS 仓库repository)中。仓库中保存了代的主控副本,以及次修改的史信息。它不保存文件的个版本,而只是简单记录发生在个版本的不同,省磁。它能做到:

a
、使开发的目仓库保持一致。可以把自己的修改提交(commit给仓库让仓库更新自己。

b
、允派生。可以测试,如果失,可以消除所做的修改,持原果。

c索任何一个版本。

原创粉丝点击