开始之前,我先假设以下几点:
1.你已经会用一个文本编辑器了,不管是哪一个,vim,gedit,kate等等的。
2.你了解C语言的基本知识了,函数,数据类型,等等
然后我们就开始讲点你还不太了解,我也是正在了解的内容。
首先,你用的是一个linux,你打开一个终端,输入gcc -v 这个命令。
我这里的输出是:
使用内建 specs。
目标:i386-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-cpu=generic --host=i386-redhat-linux
线程模型:posix
gcc 版本 4.1.2 20070925 (Red Hat 4.1.2-33)
我的gcc 版本是4.1.2,实际上我fedora 8自带的版本。
你如果没有类似的输出,你需要安装先 gcc。
然后我们再来看看你的sdl,也就是我们马上要用到的游戏开发库的安装情况。
输入这样的命令:
sdl-config --version
我的输出是:
1.2.13
这是我的sdl库的版本号,如果你没有这个库,你就要安装sdl,sdl-devel这样的包了。
如果你的数字跟我的不一样,问题倒是不大。只要是1.2.**就好了
先来学习一下gcc:
[robin@bogon ~]$ gcc --help
用法:gcc [选项] 文件...
选项:
-pass-exit-codes 在某一阶段退出时返回最高的错误码
--help 显示此帮助说明
--target-help 显示目标机器特定的命令行选项
(使用‘-v --help’显示子进程的命令行参数)
-dumpspecs 显示所有内建 spec 字符串
-dumpversion 显示编译器的版本号
-dumpmachine 显示编译器的目标处理器
-print-search-dirs 显示编译器的搜索路径
-print-libgcc-file-name 显示编译器伴随库的名称
-print-file-name=<库> 显示 <库> 的完整路径
-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径
-print-multi-directory 显示不同版本 libgcc 的根目录
-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射
-print-multi-os-directory 显示操作系统库的相对路径
-Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器
-Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器
-Wl,<选项> 将逗号分隔的 <选项> 传递给链接器
-Xassembler <参数> 将 <参数> 传递给汇编器
-Xpreprocessor <参数> 将 <参数> 传递给预处理器
-Xlinker <参数> 将 <参数> 传递给链接器
-combine 将多个源文件一次性传递给汇编器
-save-temps 不删除中间文件
-pipe 使用管道代替临时文件
-time 为每个子进程计时
-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件
-std=<标准> 指定输入源文件遵循的标准
--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录
-B <目录> 将 <目录> 添加到编译器的搜索路径中
-b <机器> 为 gcc 指定目标机器(如果有安装)
-V <版本> 运行指定版本的 gcc(如果有安装)
-v 显示编译器调用的程序
-### 与 -v 类似,但选项被引号括住,并且不执行命令
-E 仅作预处理,不进行编译、汇编和链接
-S 编译到汇编语言,不进行汇编和链接
-c 编译、汇编到目标代码,不进行链接
-o <文件> 输出到 <文件>
-x <语言> 指定其后输入文件的语言
允许的语言包括:c c++ assembler none
‘none’意味着恢复默认行为,即根据文件的扩展名猜测
源文件的语言
以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的
不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。
报告程序缺陷的步骤请参见:
<URL:http://bugzilla.redhat.com/bugzilla>.
我靠,这么多选项,请不要沮丧,其实我们要用到的还没有那么多。
我可以证明,一个选项都不用就可以编译成功一个完好的程序。
是啊,我们开始写一些代码吧,这个不是在讲程序设计吗?
新建一个 helloworld.c吧,你应该会写吧,一个最简单的程序,跟gcc说hello吧!
#include <stdio.h>
int main()
{
printf("Hello,linux and gcc!");
return 0;
}
保存这个文件,然后回到终端,运行这个命令:
gcc helloworld.c
只给出了一个文件名。
实际上,这样的情况下,如果编译成功了,你会在当前目录下找到一个a.out这样的文件。
用命令 ./a.out 来运行一下看看。
应该会在终端显示 Hello,linux and gcc! 很简单,这就够了。
你会发现,这样有个问题,就是每次的程序都是a.out这样的名字,奇怪吧,你要用到一个选项了。
-o <文件> 输出到 <文件>
也就是说,你可以指定输出的程序的名字。
gcc -o hello helloworld.c
试试看。
然后如果你成功了,那么运行 ./hello 应该还是一样的效果。
下次我们开始讲到 sdl,第一个sdl程序。
1.你已经会用一个文本编辑器了,不管是哪一个,vim,gedit,kate等等的。
2.你了解C语言的基本知识了,函数,数据类型,等等
然后我们就开始讲点你还不太了解,我也是正在了解的内容。
首先,你用的是一个linux,你打开一个终端,输入gcc -v 这个命令。
我这里的输出是:
使用内建 specs。
目标:i386-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-cpu=generic --host=i386-redhat-linux
线程模型:posix
gcc 版本 4.1.2 20070925 (Red Hat 4.1.2-33)
我的gcc 版本是4.1.2,实际上我fedora 8自带的版本。
你如果没有类似的输出,你需要安装先 gcc。
然后我们再来看看你的sdl,也就是我们马上要用到的游戏开发库的安装情况。
输入这样的命令:
sdl-config --version
我的输出是:
1.2.13
这是我的sdl库的版本号,如果你没有这个库,你就要安装sdl,sdl-devel这样的包了。
如果你的数字跟我的不一样,问题倒是不大。只要是1.2.**就好了
先来学习一下gcc:
[robin@bogon ~]$ gcc --help
用法:gcc [选项] 文件...
选项:
-pass-exit-codes 在某一阶段退出时返回最高的错误码
--help 显示此帮助说明
--target-help 显示目标机器特定的命令行选项
(使用‘-v --help’显示子进程的命令行参数)
-dumpspecs 显示所有内建 spec 字符串
-dumpversion 显示编译器的版本号
-dumpmachine 显示编译器的目标处理器
-print-search-dirs 显示编译器的搜索路径
-print-libgcc-file-name 显示编译器伴随库的名称
-print-file-name=<库> 显示 <库> 的完整路径
-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径
-print-multi-directory 显示不同版本 libgcc 的根目录
-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射
-print-multi-os-directory 显示操作系统库的相对路径
-Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器
-Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器
-Wl,<选项> 将逗号分隔的 <选项> 传递给链接器
-Xassembler <参数> 将 <参数> 传递给汇编器
-Xpreprocessor <参数> 将 <参数> 传递给预处理器
-Xlinker <参数> 将 <参数> 传递给链接器
-combine 将多个源文件一次性传递给汇编器
-save-temps 不删除中间文件
-pipe 使用管道代替临时文件
-time 为每个子进程计时
-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件
-std=<标准> 指定输入源文件遵循的标准
--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录
-B <目录> 将 <目录> 添加到编译器的搜索路径中
-b <机器> 为 gcc 指定目标机器(如果有安装)
-V <版本> 运行指定版本的 gcc(如果有安装)
-v 显示编译器调用的程序
-### 与 -v 类似,但选项被引号括住,并且不执行命令
-E 仅作预处理,不进行编译、汇编和链接
-S 编译到汇编语言,不进行汇编和链接
-c 编译、汇编到目标代码,不进行链接
-o <文件> 输出到 <文件>
-x <语言> 指定其后输入文件的语言
允许的语言包括:c c++ assembler none
‘none’意味着恢复默认行为,即根据文件的扩展名猜测
源文件的语言
以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的
不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。
报告程序缺陷的步骤请参见:
<URL:http://bugzilla.redhat.com/bugzilla>.
我靠,这么多选项,请不要沮丧,其实我们要用到的还没有那么多。
我可以证明,一个选项都不用就可以编译成功一个完好的程序。
是啊,我们开始写一些代码吧,这个不是在讲程序设计吗?
新建一个 helloworld.c吧,你应该会写吧,一个最简单的程序,跟gcc说hello吧!
#include <stdio.h>
int main()
{
printf("Hello,linux and gcc!");
return 0;
}
保存这个文件,然后回到终端,运行这个命令:
gcc helloworld.c
只给出了一个文件名。
实际上,这样的情况下,如果编译成功了,你会在当前目录下找到一个a.out这样的文件。
用命令 ./a.out 来运行一下看看。
应该会在终端显示 Hello,linux and gcc! 很简单,这就够了。
你会发现,这样有个问题,就是每次的程序都是a.out这样的名字,奇怪吧,你要用到一个选项了。
-o <文件> 输出到 <文件>
也就是说,你可以指定输出的程序的名字。
gcc -o hello helloworld.c
试试看。
然后如果你成功了,那么运行 ./hello 应该还是一样的效果。
下次我们开始讲到 sdl,第一个sdl程序。