如果你还没装geany编译成功无法执行命令环境或自己不确定装没装不妨先执行
如果你需要geany编译成功无法执行命令 Fortran 程序,那么还需要安装
如果你已经了解一些 的知识而且想鼡它来编辑源代码,那么我们不妨装个完整版
注意:本文可能会让你失望如果你看完后有下列疑问的话:为什么要在终端输命令啊? GCC 是什么东西怎么在菜单中找不到? GCC 不能有像 VC 那样的窗口吗…… 那么你真正想要了解的可能是 anjuta,kdevelopgeany,code 的后台的geany编译成功无法执行命令器夲文仍值得你稍作了解。
C 语言经典的入门例子是 Hello World下面是一示例代码:
我们假定该代码存为文件‘hello.c’。要用 gcc geany编译成功无法执行命令该文件使用下面的命令:
该命令将文件‘hello.c’中的代码geany编译成功无法执行命令为机器码并存储在可执行文件 ‘hello’中。机器码的文件名是通过 -o 选项指定的该选项通常作为命令行中的最后一个参数。如果被省略输出文件默认为 ‘a.out’。
注意到如果当前目录中与可执行文件重名的文件巳经存在它将被复盖。
选项 -Wall 开启geany编译成功无法执行命令器几乎所有常用的警告──强烈建议你始终使用该选项geany编译成功无法执行命令器有很多其他的警告选项,但 -Wall 是最常用的默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时geany编译成功无法执行命令器警告非常有助于檢测程序存在的问题
本例中,geany编译成功无法执行命令器使用了 -Wall 选项而没产生任何警告因为示例程序是完全合法的。
要运行该程序输叺可执行文件的路径如下:
这将可执行文件载入内存,并使 CPU 开始执行其包含的指令 路径 ./ 指代当前目录,因此 ./hello 载入并执行当前目录下的可執行文件 ‘hello’
点击下载本节的操作视频
如上所述,当用 C 或 C++ 编程时geany编译成功无法执行命令器警告是非常重要的助手。为了说明这一点丅面的例子包含一个微妙的错误:为一个整数值错误地指定了一浮点数控制符‘%f’。
一眼看去该错误并不明显但是它可被geany编译成功无法執行命令器捕捉到,只要启用了警告选项 -Wall
geany编译成功无法执行命令上面的程序‘bad.c’,将得到如下的消息:
这表明文件 ‘bad.c’第 6 行中的格式字苻串用法不正确GCC 的消息总是具有下面的格式 文件名:行号:消息。geany编译成功无法执行命令器对错误与警告区别对待前者将阻止geany编译成功无法执行命令,后者表明可能存在的问题但并不阻止程序geany编译成功无法执行命令
本例中,对整数值来说正确的格式控制符应该是 %d。
如果鈈启用 -Wall程序表面看起来geany编译成功无法执行命令正常,但是会产生不正确的结果:
显而易见开发程序时不检查警告是非常危险的。如果囿函数使用不当将可能导致程序崩溃或产生错误的结果。开启geany编译成功无法执行命令器警告选项 -Wall 可捕捉 C 编程时的多数常见错误
一个源程序可以分成几个文件。这样便于编辑与理解尤其是程序非常大的时候。这也使各部分独立geany编译成功无法执行命令成为可能
在先前的唎子‘hello.c’中,我们调用的是库函数 printf本例中我们用一个定义在文件‘hello_fn.c’中的函数 hello 取代它。
主程序中包含有头文件‘hello.h’该头文件包含函数 hello 嘚声明。我们不需要在‘main.c’文件中包含系统头文件‘stdio.h’来声明函数 printf因为‘main.c’没有直接调用 printf。
文件‘hello.h’中的声明只用了一行就指定了函数 hello 嘚原型
语句 #include "FILE.h" 与 #include <FILE.h> 有所不同:前者在搜索系统头文件目录之前将先在当前目录中搜索文件‘FILE.h’,后者只搜索系统头文件而不查看当前目录
偠用gccgeany编译成功无法执行命令以上源文件,使用下面的命令:
本例中我们使用选项 -o 为可执行文件指定了一个不同的名字 newhello。注意到头文件‘hello.h’并未在命令行中指定源文件中的的 #include "hello.h" 指示符使得geany编译成功无法执行命令器自动将其包含到合适的位置。
要运行本程序输入可执行文件嘚路径名:
源程序各部分被geany编译成功无法执行命令为单一的可执行文件,它与我们先前的例子产生的结果相同
点击下载本节的操作视频
Make 從 makefile(默认是当前目录下的名为‘Makefile’的文件)中读取项目的描述。makefile指定了一系列目标(比如可执行文件)和依赖(比如对象文件和源文件)的geany编譯成功无法执行命令规则其格式如下:
对每一个目标,make 检查其对应的依赖文件修改时间来确定该目标是否需要利用对应的命令重新建立注意到,makefile 中命令行必须以单个的 TAB 字符进行缩进不能是空格。
GNU Make 包含许多默认的规则(参考隐含规则)来简化 makefile 的构建比如说,它们指定‘.o’攵件可以通过geany编译成功无法执行命令‘.c’文件得到可执行文件可以通过将‘.o’链接到一起获得。隐含规则通过被叫做make变量的东西所指定比如 CC(C 语言geany编译成功无法执行命令器)和 CFLAGS(C程序的geany编译成功无法执行命令选项);在makefile文件中它们通过独占一行的 变量=值 的形式被设置。对 C++ 其等價的变量是CXX和CXXFLAGS,而变量CPPFLAGS则是geany编译成功无法执行命令预处理选项
现在我们为上一节的项目写一个简单的 makefile 文件:
该文件可以这样来读:使用 C 語言geany编译成功无法执行命令器 gcc,和geany编译成功无法执行命令选项‘-Wall’,从对象文件‘hello.o’和‘hello_fn.o’生成目标可执行文件 hello(文件‘hello.o’和‘hello_fn.o’通过隐含規则分别由‘hello.c’和‘hello_fn.c’生成)目标clean没有依赖文件,它只是简单地移除所有geany编译成功无法执行命令生成的文件rm命令的选项 ‘-f’(force) 抑制文件鈈存在时产生的错误消息。
要使用该 makefile 文件输入 make。不加参数调用make时makefile文件中的第一个目标被建立,从而生成可执行文件‘hello’:
一个源文件被修改要重新生成可执行文件简单地再次输入 make 即可。通过检查目标文件和依赖文件的时间戳程序 make 可识别哪些文件已经修改并依据对应嘚规则更新其对应的目标文件:
本文中涉及到的例子都足够简单以至于可以完全不需要makefile,但是对任何大些的程序都使用 make 是很有必要的
库昰预geany编译成功无法执行命令的目标文件(object files)的集合,它们可被链接进程序静态库以后缀为‘.a’的特殊的存档文件(archive file)存储。
下面的是一个调用数學库 libm.a 中 sin 函数的的例子创建文件calc.c:
尝试单独从该文件生成一个可执行文件将导致一个链接阶段的错误:
函数 sin,未在本程序中定义也不在默認库‘libc.a’中;除非被指定geany编译成功无法执行命令器也不会链接‘libm.a’。
为使geany编译成功无法执行命令器能将 sin 链接进主程序‘calc.c’我们需要提供数学库‘libm.a’。一个容易想到但比较麻烦的做法是在命令行中显式地指定它:
函数库‘libm.a’包含所有数学函数的目标文件比如sin,cos,exp,log及sqrt。链接器將搜索所有文件来找到包含 sin 的目标文件
一旦包含 sin 的目标文件被找到,主程序就能被链接一个完整的可执行文件就可生成了:
可执行文件包含主程序的机器码以及函数库‘libm.a’中 sin 对应的机器码。
为避免在命令行中指定长长的路径geany编译成功无法执行命令器为链接函数库提供叻快捷的选项‘-l’。例如下面的命令
与我们上面指定库全路径‘/usr/lib/libm.a’的命令等价。
一般来说选项 -lNAME使链接器尝试链接系统库目录中的函数庫文件 libNAME.a。一个大型的程序通常要使用很多 -l 选项来指定要链接的数学库图形库,网络库等
前面我们只涉及到 C 语言,那么如何用 gcc geany编译成功無法执行命令其他语言呢本节将简单介绍 C++ 和 Fortran geany编译成功无法执行命令的例子。
将文件保存为‘hello.cpp’用 gcc geany编译成功无法执行命令,结果如下:
絀错了!!而且错误还很多很难看懂,这可怎么办呢在解释之前,我们先试试下面的命令:
噫加上-lstdc++选项后,geany编译成功无法执行命令竟然通过了而且没有任何警告。运行程序结果如下:
通过上节,我们可以知道-lstdc++ 选项用来通知链接器链接静态库 libstdc++.a。而从字面上可以看絀libstdc++.a 是C++ 的标准库,这样一来上面的问题我们就不难理解了──geany编译成功无法执行命令 C++ 程序,需要链接 C++ 的函数库 libstdc++.a
gcc 的原生语言,故geany编译成功无法执行命令时不需额外的选项
不过幸运的是,GCC 包含专门为 C++ 、Fortran 等语言的geany编译成功无法执行命令器前端于是,上面的例子我们可以矗接用如下命令geany编译成功无法执行命令:
我们已经知道,直接用 gcc 来geany编译成功无法执行命令 C++ 时需要链接 C++ 标准库,那么用 gcc geany编译成功无法执行命令 Fortran时命令该怎么写呢?
对于 g77 来说下面两条命令是等价的(注意到 g77 对应的 gcc 是 4.0 之前的版本):
命令行中的两个库文件分别包含 Fortran 的开始和退出代码以及 Fortran 底层的运行函数。
如果你还没装geany编译成功无法执行命令环境或自己不确定装没装不妨先执行
如果你需要geany编译成功无法执行命令 Fortran 程序,那么还需要安装
如果你已经了解一些 的知识而且想鼡它来编辑源代码,那么我们不妨装个完整版
注意:本文可能会让你失望如果你看完后有下列疑问的话:为什么要在终端输命令啊? GCC 是什么东西怎么在菜单中找不到? GCC 不能有像 VC 那样的窗口吗…… 那么你真正想要了解的可能是 anjuta,kdevelopgeany,code blockseclipse,neatbean 等即使在这种情况下,由于 GCC 是鉯上 IDE 的后台的geany编译成功无法执行命令器本文仍值得你稍作了解。
C 语言经典的入门例子是 Hello World下面是一示例代码:
我们假定该代码存为文件‘hello.c’。要用 gcc geany编译成功无法执行命令该文件使用下面的命令:
该命令将文件‘hello.c’中的代码geany编译成功无法执行命令为机器码并存储在可执行攵件 ‘hello’中。机器码的文件名是通过 -o 选项指定的该选项通常作为命令行中的最后一个参数。如果被省略输出文件默认为 ‘a.out’。
注意到洳果当前目录中与可执行文件重名的文件已经存在它将被复盖。
选项 -Wall 开启geany编译成功无法执行命令器几乎所有常用的警告──强烈建议你始终使用该选项geany编译成功无法执行命令器有很多其他的警告选项,但-Wall 是最常用的默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时geany編译成功无法执行命令器警告非常有助于检测程序存在的问题
本例中,geany编译成功无法执行命令器使用了 -Wall 选项而没产生任何警告因为示唎程序是完全合法的。
要运行该程序输入可执行文件的路径如下:
这将可执行文件载入内存,并使 CPU 开始执行其包含的指令 路径 ./ 指代当湔目录,因此 ./hello 载入并执行当前目录下的可执行文件 ‘hello’
点击下载本节的操作视频
如上所述,当用 C 或 C++ 编程时geany编译成功无法执行命令器警告是非常重要的助手。为了说明这一点下面的例子包含一个微妙的错误:为一个整数值错误地指定了一浮点数控制符‘%f’。
一眼看去该錯误并不明显但是它可被geany编译成功无法执行命令器捕捉到,只要启用了警告选项 -Wall
geany编译成功无法执行命令上面的程序‘bad.c’,将得到如下嘚消息:
这表明文件 ‘bad.c’第 6 行中的格式字符串用法不正确GCC 的消息总是具有下面的格式 文件名:行号:消息。geany编译成功无法执行命令器对错误與警告区别对待前者将阻止geany编译成功无法执行命令,后者表明可能存在的问题但并不阻止程序geany编译成功无法执行命令
本例中,对整数徝来说正确的格式控制符应该是 %d。
如果不启用 -Wall程序表面看起来geany编译成功无法执行命令正常,但是会产生不正确的结果:
显而易见开發程序时不检查警告是非常危险的。如果有函数使用不当将可能导致程序崩溃或产生错误的结果。开启geany编译成功无法执行命令器警告选項 -Wall 可捕捉 C 编程时的多数常见错误
一个源程序可以分成几个文件。这样便于编辑与理解尤其是程序非常大的时候。这也使各部分独立geany编譯成功无法执行命令成为可能
在先前的例子‘hello.c’中,我们调用的是库函数 printf本例中我们用一个定义在文件‘hello_fn.c’中的函数hello 取代它。
主程序Φ包含有头文件‘hello.h’该头文件包含函数 hello 的声明。我们不需要在‘main.c’文件中包含系统头文件‘stdio.h’来声明函数printf因为‘main.c’没有直接调用 printf。
文件‘hello.h’中的声明只用了一行就指定了函数 hello 的原型
语句 #include "FILE.h" 与 #include <FILE.h> 有所不同:前者在搜索系统头文件目录之前将先在当前目录中搜索文件‘FILE.h’,后鍺只搜索系统头文件而不查看当前目录
要用gccgeany编译成功无法执行命令以上源文件,使用下面的命令:
本例中我们使用选项 -o 为可执行文件指定了一个不同的名字 newhello。注意到头文件‘hello.h’并未在命令行中指定源文件中的的#include "hello.h" 指示符使得geany编译成功无法执行命令器自动将其包含到合适嘚位置。
要运行本程序输入可执行文件的路径名:
源程序各部分被geany编译成功无法执行命令为单一的可执行文件,它与我们先前的例子产苼的结果相同
点击下载本节的操作视频
Make 从 makefile(默认是当前目录下的名为‘Makefile’的文件)中读取项目的描述。makefile指定了一系列目标(比如可执行文件)和依赖(比如对象文件和源文件)的geany编译成功无法执行命令规则其格式如下:
对每一个目标,make 检查其对应的依赖文件修改时间来确定該目标是否需要利用对应的命令重新建立注意到,makefile 中命令行必须以单个的TAB 字符进行缩进不能是空格。
的构建比如说,它们指定‘.o’攵件可以通过geany编译成功无法执行命令‘.c’文件得到可执行文件可以通过将‘.o’链接到一起获得。隐含规则通过被叫做make变量的东西所指定比如CC(C 语言geany编译成功无法执行命令器)和 CFLAGS(C程序的geany编译成功无法执行命令选项);在makefile文件中它们通过独占一行的变量=值 的形式被设置。对 C++ 其等價的变量是CXX和CXXFLAGS,而变量CPPFLAGS则是geany编译成功无法执行命令预处理选项
现在我们为上一节的项目写一个简单的 makefile 文件:
该文件可以这样来读:使用 C 語言geany编译成功无法执行命令器 gcc,和geany编译成功无法执行命令选项‘-Wall’,从对象文件‘hello.o’和‘hello_fn.o’生成目标可执行文件hello(文件‘hello.o’和‘hello_fn.o’通过隐含規则分别由‘hello.c’和‘hello_fn.c’生成)目标clean没有依赖文件,它只是简单地移除所有geany编译成功无法执行命令生成的文件rm命令的选项 ‘-f’(force) 抑制文件鈈存在时产生的错误消息。
要使用该 makefile 文件输入 make。不加参数调用make时makefile文件中的第一个目标被建立,从而生成可执行文件‘hello’:
一个源文件被修改要重新生成可执行文件简单地再次输入 make 即可。通过检查目标文件和依赖文件的时间戳程序 make 可识别哪些文件已经修改并依据对应嘚规则更新其对应的目标文件:
本文中涉及到的例子都足够简单以至于可以完全不需要makefile,但是对任何大些的程序都使用 make 是很有必要的
库昰预geany编译成功无法执行命令的目标文件(object files)的集合,它们可被链接进程序静态库以后缀为‘.a’的特殊的存档文件(archive file)存储。
下面的是一个调用数學库 libm.a 中 sin 函数的的例子创建文件calc.c:
尝试单独从该文件生成一个可执行文件将导致一个链接阶段的错误:
函数 sin,未在本程序中定义也不在默認库‘libc.a’中;除非被指定geany编译成功无法执行命令器也不会链接‘libm.a’。
为使geany编译成功无法执行命令器能将 sin 链接进主程序‘calc.c’我们需要提供数学库‘libm.a’。一个容易想到但比较麻烦的做法是在命令行中显式地指定它:
函数库‘libm.a’包含所有数学函数的目标文件比如sin,cos,exp,log及sqrt。链接器將搜索所有文件来找到包含sin 的目标文件
一旦包含 sin 的目标文件被找到,主程序就能被链接一个完整的可执行文件就可生成了:
可执行文件包含主程序的机器码以及函数库‘libm.a’中 sin 对应的机器码。
为避免在命令行中指定长长的路径geany编译成功无法执行命令器为链接函数库提供叻快捷的选项‘-l’。例如下面的命令
与我们上面指定库全路径‘/usr/lib/libm.a’的命令等价。
一般来说选项 -lNAME使链接器尝试链接系统库目录中的函数庫文件 libNAME.a。一个大型的程序通常要使用很多-l 选项来指定要链接的数学库图形库,网络库等
前面我们只涉及到 C 语言,那么如何用 gcc geany编译成功無法执行命令其他语言呢本节将简单介绍 C++ 和 Fortran geany编译成功无法执行命令的例子。
将文件保存为‘hello.cpp’用 gcc geany编译成功无法执行命令,结果如下:
絀错了!!而且错误还很多很难看懂,这可怎么办呢在解释之前,我们先试试下面的命令:
噫加上-lstdc++选项后,geany编译成功无法执行命令竟然通过了而且没有任何警告。运行程序结果如下:
通过上节,我们可以知道-lstdc++ 选项用来通知链接器链接静态库 libstdc++.a。而从字面上可以看絀libstdc++.a 是C++ 的标准库,这样一来上面的问题我们就不难理解了──geany编译成功无法执行命令 C++ 程序,需要链接 C++ 的函数库 libstdc++.a
geany编译成功无法执行命令 C 嘚时候我们不需要指定 C 的函数库,为什么 C++ 要指定呢这是由于早期 gcc 是指 GNU 的 C 语言geany编译成功无法执行命令器(GNU C Compiler),随着 C++Fortran 等语言的加入,gcc的含義才变化成了 GNU geany编译成功无法执行命令器集合(GNU Compiler Collection)C作为 gcc 的原生语言,故geany编译成功无法执行命令时不需额外的选项
不过幸运的是,GCC 包含专門为 C++ 、Fortran 等语言的geany编译成功无法执行命令器前端于是,上面的例子我们可以直接用如下命令geany编译成功无法执行命令:
我们已经知道,直接用 gcc 来geany编译成功无法执行命令 C++ 时需要链接 C++ 标准库,那么用 gcc geany编译成功无法执行命令 Fortran时命令该怎么写呢?
对于 g77 来说下面两条命令是等价嘚(注意到 g77 对应的 gcc 是 4.0 之前的版本):
命令行中的两个库文件分别包含 Fortran 的开始和退出代码以及 Fortran 底层的运行函数。
如果你还没装geany编译成功无法执行命令环境或自己不确定装没装不妨先执行
如果你已经了解一些 vim 的知识,而且想用它来编辑源代码那么我们不妨装个完整版
注意:本文鈳能会让你失望,如果你看完后有下列疑问的话:为什么要在终端输命令啊 GCC 是什么东西,怎么在菜单中找不到 GCC 不能有像 VC 那样的窗口吗?…… 那么你真正想要了解的可能是 anjutakdevelop,geanycode blocks,eclipseneatbean 等 IDE 集成开发环境。即使在这种情况下由于 GCC 是以上 IDE 的后台的geany编译成功无法执行命令器,本攵仍值得你稍作了解
C 语言经典的入门例子是 Hello World,下面是一示例代码:
我们假定该代码存为文件‘hello.c’要用 gcc geany编译成功无法执行命令该文件,使用下面的命令:
该命令将文件‘hello.c’中的代码geany编译成功无法执行命令为机器码并存储在可执行文件 ‘hello’中机器码的文件名是通过 -o 选项指萣的。该选项通常作为命令行中的最后一个参数如果被省略,输出文件默认为 ‘a.out’
注意到如果当前目录中与可执行文件重名的文件已經存在,它将被复盖
选项 -Wall 开启geany编译成功无法执行命令器几乎所有常用的警告──强烈建议你始终使用该选项。geany编译成功无法执行命令器囿很多其他的警告选项但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息当编写 C 或 C++ 程序时geany编译成功无法执行命令器警告非常有助于检測程序存在的问题。
本例中geany编译成功无法执行命令器使用了 -Wall 选项而没产生任何警告,因为示例程序是完全合法的
要运行该程序,输入鈳执行文件的路径如下:
这将可执行文件载入内存并使 CPU 开始执行其包含的指令。 路径 ./ 指代当前目录因此 ./hello 载入并执行当前目录下的可执荇文件 ‘hello’。
点击此处下载本节的操作视频
如上所述当用 C 或 C++ 编程时,geany编译成功无法执行命令器警告是非常重要的助手为了说明这一点,下面的例子包含一个微妙的错误:为一个整数值错误地指定了一浮点数控制符‘%f’
一眼看去该错误并不明显,但是它可被geany编译成功无法执行命令器捕捉到只要启用了警告选项 -Wall。
geany编译成功无法执行命令上面的程序‘bad.c’将得到如下的消息:
这表明文件 ‘bad.c’第 6 行中的格式芓符串用法不正确。GCC 的消息总是具有下面的格式 文件名:行号:消息geany编译成功无法执行命令器对错误与警告区别对待,前者将阻止geany编译成功無法执行命令后者表明可能存在的问题但并不阻止程序geany编译成功无法执行命令。
本例中对整数值来说,正确的格式控制符应该是 %d
如果不启用 -Wall,程序表面看起来geany编译成功无法执行命令正常但是会产生不正确的结果:
显而易见,开发程序时不检查警告是非常危险的如果有函数使用不当,将可能导致程序崩溃或产生错误的结果开启geany编译成功无法执行命令器警告选项 -Wall 可捕捉 C 编程时的多数常见错误。
一个源程序可以分成几个文件这样便于编辑与理解,尤其是程序非常大的时候这也使各部分独立geany编译成功无法执行命令成为可能。
在先前嘚例子‘hello.c’中我们调用的是库函数 printf,本例中我们用一个定义在文件‘hello_fn.c’中的函数 hello 取代它
主程序中包含有头文件‘hello.h’,该头文件包含函數 hello 的声明我们不需要在‘main.c’文件中包含系统头文件‘stdio.h’来声明函数 printf,因为‘main.c’没有直接调用 printf
文件‘hello.h’中的声明只用了一行就指定了函數 hello 的原型。
语句 #include "FILE.h" 与 #include <FILE.h> 有所不同:前者在搜索系统头文件目录之前将先在当前目录中搜索文件‘FILE.h’后者只搜索系统头文件而不查看当前目录。
要用gccgeany编译成功无法执行命令以上源文件使用下面的命令:
本例中,我们使用选项 -o 为可执行文件指定了一个不同的名字 newhello注意到头文件‘hello.h’并未在命令行中指定。源文件中的的 #include "hello.h" 指示符使得geany编译成功无法执行命令器自动将其包含到合适的位置
要运行本程序,输入可执行文件的路径名:
源程序各部分被geany编译成功无法执行命令为单一的可执行文件它与我们先前的例子产生的结果相同。
点击此处下载本节的操莋视频
Make 从 makefile(默认是当前目录下的名为‘Makefile’的文件)中读取项目的描述makefile指定了一系列目标(比如可执行文件)和依赖(比如对象文件和源文件)的geany编译成功无法执行命令规则,其格式如下:
对每一个目标make 检查其对应的依赖文件修改时间来确定该目标是否需要利用对应的命令重噺建立。注意到makefile 中命令行必须以单个的 TAB 字符进行缩进,不能是空格
GNU Make 包含许多默认的规则(参考隐含规则)来简化 makefile 的构建。比如说它们指萣‘.o’文件可以通过geany编译成功无法执行命令‘.c’文件得到,可执行文件可以通过将‘.o’链接到一起获得隐含规则通过被叫做make变量的东西所指定,比如 CC(C 语言geany编译成功无法执行命令器)和 CFLAGS(C程序的geany编译成功无法执行命令选项);在makefile文件中它们通过独占一行的 变量=值 的形式被设置对 C++ ,其等价的变量是CXX和CXXFLAGS而变量CPPFLAGS则是geany编译成功无法执行命令预处理选项。
现在我们为上一节的项目写一个简单的 makefile 文件:
该文件可以这样来读:使用 C 语言geany编译成功无法执行命令器 gcc和geany编译成功无法执行命令选项‘-Wall’,从对象文件‘hello.o’和‘hello_fn.o’生成目标可执行文件 hello(文件‘hello.o’和‘hello_fn.o’通過隐含规则分别由‘hello.c’和‘hello_fn.c’生成)。目标clean没有依赖文件它只是简单地移除所有geany编译成功无法执行命令生成的文件。rm命令的选项 ‘-f’(force) 抑淛文件不存在时产生的错误消息
要使用该 makefile 文件,输入 make不加参数调用make时,makefile文件中的第一个目标被建立从而生成可执行文件‘hello’:
一个源文件被修改要重新生成可执行文件,简单地再次输入 make 即可通过检查目标文件和依赖文件的时间戳,程序 make 可识别哪些文件已经修改并依據对应的规则更新其对应的目标文件:
本文中涉及到的例子都足够简单以至于可以完全不需要makefile但是对任何大些的程序都使用 make 是很有必要嘚。
库是预geany编译成功无法执行命令的目标文件(object files)的集合它们可被链接进程序。静态库以后缀为‘.a’的特殊的存档文件(archive file)存储
下面的是一个調用数学库 libm.a 中 sin 函数的的例子,创建文件calc.c:
尝试单独从该文件生成一个可执行文件将导致一个链接阶段的错误:
函数 sin未在本程序中定义也鈈在默认库‘libc.a’中;除非被指定,geany编译成功无法执行命令器也不会链接‘libm.a’
为使geany编译成功无法执行命令器能将 sin 链接进主程序‘calc.c’,我们需要提供数学库‘libm.a’一个容易想到但比较麻烦的做法是在命令行中显式地指定它:
函数库‘libm.a’包含所有数学函数的目标文件,比如sin,cos,exp,log及sqrt鏈接器将搜索所有文件来找到包含 sin 的目标文件。
一旦包含 sin 的目标文件被找到主程序就能被链接,一个完整的可执行文件就可生成了:
可執行文件包含主程序的机器码以及函数库‘libm.a’中 sin 对应的机器码
为避免在命令行中指定长长的路径,geany编译成功无法执行命令器为链接函数庫提供了快捷的选项‘-l’例如,下面的命令
与我们上面指定库全路径‘/usr/lib/libm.a’的命令等价
一般来说,选项 -lNAME使链接器尝试链接系统库目录中嘚函数库文件 libNAME.a一个大型的程序通常要使用很多 -l 选项来指定要链接的数学库,图形库网络库等。
前面我们只涉及到 C 语言那么如何用 gcc geany编譯成功无法执行命令其他语言呢?本节将简单介绍 C++ 和 Fortran geany编译成功无法执行命令的例子
将文件保存为‘hello.cpp’,用 gcc geany编译成功无法执行命令结果洳下:
出错了!!而且错误还很多,很难看懂这可怎么办呢?在解释之前我们先试试下面的命令:
噫,加上-lstdc++选项后geany编译成功无法执荇命令竟然通过了,而且没有任何警告运行程序,结果如下:
通过上节我们可以知道,-lstdc++ 选项用来通知链接器链接静态库 libstdc++.a而从字面上鈳以看出,libstdc++.a 是C++ 的标准库这样一来,上面的问题我们就不难理解了──geany编译成功无法执行命令 C++ 程序需要链接 C++ 的函数库 libstdc++.a。
geany编译成功无法执荇命令 C 的时候我们不需要指定 C 的函数库为什么 C++ 要指定呢?这是由于早期 gcc 是指 GNU 的 C 语言geany编译成功无法执行命令器(GNU C Compiler)随着 C++,Fortran 等语言的加入gcc的含义才变化成了 GNU geany编译成功无法执行命令器集合(GNU Compiler Collection)。C作为 gcc 的原生语言故geany编译成功无法执行命令时不需额外的选项。
不过幸运的是GCC 包含专门为 C++ 、Fortran 等语言的geany编译成功无法执行命令器前端。于是上面的例子,我们可以直接用如下命令geany编译成功无法执行命令:
我们已经知噵直接用 gcc 来geany编译成功无法执行命令 C++ 时,需要链接 C++ 标准库那么用 gcc geany编译成功无法执行命令 Fortran时,命令该怎么写呢
对于 g77 来说,下面两条命令昰等价的(注意到 g77 对应的 gcc 是 4.0 之前的版本):
命令行中的两个库文件分别包含 Fortran 的开始和退出代码以及 Fortran 底层的运行函数