在Linux中开发c或c++程序的步骤:
先用vim编辑c或c++程序 c保存为.c c++保存为.cc 或.cpp文件
1. gcc/g++编译器
对于.c格式的C文件,可以采用gcc或g++编译
对于 .cc、.cpp格式的C++文件,应该采用g++进行编译
gcc编译过程
gcc所支持后缀名
预处理阶段:对包含的头文件(#include)和宏定义(#define、#ifdef等)进行处理
gcc –E hello.c –o hello.i
编译阶段:检查代码规范性、语法错误等,在检查无误后把代码翻译成汇编语言
gcc –S hello.i –ohello.s
gcc常用选项
gcc库选项
函数库分为静态库和动态库,静态库是目标文件.o的归档文件(格式为libname.a)。如果在编译某个程序时链接静态库,则链接器将会搜索静态库并直接拷贝到该程序的可执行二进制文件到当前文件中;动态库(格式为libname.so[.主版本号.次版本号.发行号])在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。
创建静态库
$ gcc -c add.c
$ ar rcsv libadd.a add.o
$ gcc -o mian main.c -L. –ladd
$./main
创建动态库
$ gcc -fPIC -Wall -c add.c
$ gcc -shared-o libadd.so add.o
$ gcc -o mainmain.c -L. –lpow
在运行main前,需要注册动态库的路径。方法有3种:修改/etc/ld.so.conf或修改LD_LIBRARY_PATH环境变量或将库文件拷贝到/lib或者/usr/lib下(系统默认搜索库路径)。
$ cp add.so /lib
$ ./main
静态库与动态库的比较:
动态库只在执行时才被链接使用,不是直接编译入可执行文件,并且一个动态库可以被多个程序使用故可称为共享库,而静态库将会整合到程序中,因此在程序执行时不用加载静态库。因此,静态库会使你的程序臃肿并且难以升级,但比较容易部署。而动态库会使你的程序轻便易于升级但难以部署。
gcc--- 警告选项
$ gcc –ansiwarning.c –o warning
warning.c: 在函数“main”中:
warning.c:7 警告:在无返回值的函数中,“return”带返回值
warning.c:4 警告:“main”的返回类型不是“int”
$ gcc –pedanticwarning.c –o warning
warning.c: 在函数“main”中:
warning.c:5 警告:ISO C90不支持“long long”
warning.c:7 警告:在无返回值的函数中,“return”带返回值
warning.c:4 警告:“main”的返回类型不是“int”
$ gcc –Wallwarning.c –o warning
warning.c:4 警告:“main”的返回类型不是“int”
warning.c: 在函数“main”中:
warning.c:7 警告:在无返回值的函数中,“return”带返回值
warning.c:5 警告:未使用的变量“tmp”
gcc--- 优化选项
gcc对代码进行优化通过选项“-On”来控制优化级别(n是整数)。
-D <宏定义> 编译时将宏定义传入进去
例:有两个文件main.cpp,func.cpp
其中
main.cpp内容为:
#include <stdio.h>
int MyFunc();
int main()
{
#ifdef _DEBUG
printf("Debug MyFuncis:%d\n",MyFunc());
#else
printf("NDEBUG MyFuncis:%d\n",MyFunc());
#endif
}
func.cpp内容为:
int MyFunc()
{
return 123;
}
编译和连接:
1、 g++ -c func.cpp
将编译func.cpp,并且生成同名的但扩展名为.o的二进制目标文件 func.o
g++ -c main.cpp
将编译main.cpp,并且生成同名的但扩展名为.o的二进制目标文件main.o
2、g++ -c func.cpp -o func.o
g++ -c main.cpp –o main.o
编译main.cpp,并输出目标文件main.o
3、 链接
g++ main.o func.o
g++ -o a.out main.o func.o
g++ -o a.out *.o
都将连接目标文件main.o和func.o最后形成可执行文件a.out
对于第一种,如果没有显式指定可执行文件名,g++默认为a.out
4、 也可以将编译和链接的过程合为一块处理:
g++ *.cpp
g++ func.cppmain.cpp
g++ -o a.outfunc.cpp main.cpp
都将先编译指定的源文件,如果成功的话,再链接成可执行文件a.out
采用第4种方式,在其中第某个源文件中必须有main函数,否则链接通不过。
5、 如果希望在编译时传入宏定义,可使用-D参数,例如
g++ -D _DEBUG*.cpp