共计 4201 个字符,预计需要花费 11 分钟才能阅读完成。
这篇文章给大家介绍 linux gcc 的概念及其参数是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
下面是丸趣 TV 小编给大家搜集关于块设备的概念以及作用。
1、linux gcc 包含的 c /c++ 编译器
gcc、cc、c++、g++:
gcc 和 cc 是一样的,c++ 和 g ++ 是一样的,一般 c 程序就用 gcc 编译,c++ 程序就用 g ++ 编译
2、linux gcc 的基本用法
gcc test.c 这样将编译出一个名为 a.out 的程序
gcc test.c -o test 这样将编译出一个名为 test 的程序
- o 参数用来指定生成程序的名字
3、为什么会出现 undefined reference to xxxxx 错误?
首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入 -lm #P#
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.s
o.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-config,执行 gtk-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 用来包含头文件,但一般情况下包含头文件都在源码里用 #include 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 #P#
8、几个相关的环境变量
PKG_CONFIG_PATH:用来指定 pkg-config 用到的 pc 文件的路径,默认是 /usr/lib/pkgconfig,pc 文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs 参数和 Cflags 参数等等。
CC:用来指定 c 编译器
CXX:用来指定 cxx 编译器
LIBS:跟上面的 –libs 作用差不多
CFLAGS: 跟上面的 –cflags 作用差不多
CC,CXX,LIBS,CFLAGS 手动编译时一般用不上,在做 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-gnu-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
gcc 与 g ++
Linux 中最重要的软件开发工具是 GCC。GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 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 生成所有警告信息。
关于 linux gcc 的概念及其参数是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。