首页 > 编程知识 正文

linux怎么用gcc编译,crontab 命令

时间:2023-05-06 05:11:03 阅读:21298 作者:3197

1、gcc中包含的c/c编译器 gcc、cc、c、g gcc和cc相同,c和g相同,常见的c程序用gcc编译,c程序用g编译 2、gcc的基本使用方法 gcc test.c以这种方式编译名为a.out的程序 gcc test.c -o test以这种方式编译名为test的程序 -o参数用于指定生成器的名称 3、为什么会出现“统一参考到”xxxxx

'错误?

首先,这是链接错误,不是编译错误。 这意味着,如果只有这个错误,程序的源代码本身就没有问题,编译器编译时参数错误,没有指定链接程序使用的库。 例如,如果程序使用数学函数,则要在编译参数中指定程序链接到数学库,请在编译命令行中添加-lm

4、-l参数和-l参数

-l参数用于指定程序链接到的库,库名称紧跟在-l参数之后。 库名称与真正的库文件名有什么关系呢? 就数学库而言,很容易看出他的库名是m,他的库文件名是libm.so,去掉库文件名开头的lib和结尾的. so就是库名

好了,我知道怎么得到库名。 如果使用第三方提供的库名称libtest.so,则可以使用libtest.so库,方法是将libtest.so复制到/usr/lib中,并在编译时添加-ltest参数()

/lib、/usr/lib和/usr/local/lib中的库可以直接通过-l参数链接,但如果库文件位于其他目录中,而不是这三个目录中,则我们可以使用-l参数错误消息可能是:“/usr/高贵的水杯/,即链接器ld在其三个目录中找不到libxxx.so时,另一个参数-L会很有用。 例如,常用的X11库位于/usr/X11R6/lib目录中,编译时使用-L/usr/X11R6/lib -lX11参数,例如libtest.so为//

另外,大部分的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/高贵的水杯目录中。 例如

gtk1.2的链接参数生成程序为gtk-config,运行gtk-config --libs后输出如下' -

l/usr/Li B- l/usr/x11r6/Li B- lgtk-LG dk-rdynamic

- LG module-lglib-LDL-lxi-LX ext-lx11-lm ',这是编译gtk1.2程序所需的g

tk链接参数,xxx-config除了--libs参数外,还包含--cflags用于生成标头语句的参数

m">件包含目录的,也就是-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

8、几个相关的环境变量

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

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参数指定编译器用spar

c系统的库和头文件,不能用本地(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”定义 温暖的小海豚。

-DMACRO=DEFN 以字符串“DEFN”定义 温暖的小海豚。

-E 只运行 C 预编译器。

-g 生成调试信息。GNU 调试器可利用该信息。

-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。

-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。

-lLIBRARY 连接时搜索指定的函数库LIBRARY。

-m486 针对 486 进行代码优化。

-o FILE 生成指定的输出文件。用在生成可执行文件时。

-O0 不进行优化处理。

-O 或 -O1 优化生成代码。

-O2 进一步优化。

-O3 比 -O2 更进一步优化,包括 inline 函数。

-shared 生成共享目标文件。通常用在建立共享库时。

-static 禁止使用共享连接。

-UMACRO 取消对 温暖的小海豚的定义。

-w 不生成任何警告信息。

-Wall 生成所有警告信息。

GNU 的调试器称为 gdb

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

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

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

c、可查找历史记录。防止 bug 的再引入。(diff)

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

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

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

b、允许代码派生。可以进行测试,如果失败,可以消除所做的修改,维持原结果。

c、检索任何一个版本。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。