第一节 linux c编译

在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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值