Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1288209
  • 博文数量: 632
  • 博客积分: 2778
  • 博客等级: 大尉
  • 技术积分: 3387
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 09:09
个人简介

123

文章分类

全部博文(632)

文章存档

2014年(36)

2013年(33)

2012年(563)

分类:

2012-10-23 09:26:31

原文地址:linux下编译c/c++ 作者:pet_dongdong

一、gcc和g++
1、最简单的编译
 
gcc编译c程序:
gcc -c test.c
gcc -o test test.o
 
g++编译c++程序:
g++ -c test.cpp
g++ -o testpp test.o
 
gcc与g++
g++和gcc的区别是会在c++程序链接时,自动引用c++库,而gcc不会。
 
gcc -c test.cpp
gcc -o testpp test.o -lstdc++
 
gcc默认的头文件路径包括/include和/usr/include
-I 附加头文件路径
 
gcc -c test.c -I Headpath
 
2、带链接库的编译

gcc默认的库路径包括/lib和/usr/lib
 
-l 附加引用库
-L 附加引用头文件路径
 
gcc -o test test.o -lLibname -L libpath
 
3、常用编译选项
-Wall 打开所有警告
-O    优化
-g    调试版本
-p    将剖析(Profiling)信息加入到最终生成的二进制代码中。剖析信息包含了更为详细的调试信息
-pg   生成的剖析(Profiling)信息只能由GNU剖析工具(gprof)分析
 
备注:
编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项-O3则除了完成所有-O2级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。许多Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。
 
4、生成静态库和动态库
静态库  ar staticlib.a test.o
ar选项:
cr  将object文件封装(archive),我们能使用nm -s 命令来查看.a文件的内容
 
动态库  gcc -shared -o sharelib.so test.o
选项:
 -fPIC 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
 
备注:
LD_LIBRARY_PATH:这个环境变量指示动态连接器能装载动态库的路径。
 
二、makefile
make程序在当前目录中寻找名为makefile的文件,这个文件列出了源代码文件间的依赖关系。make程序观察文件的日期,如果一个依赖文件的日期比它所依赖的文件旧,就执行依赖关系之后列出的规则(一串命令行命令)。
makefile基本组成项为:
[依赖文件:被依赖文件]
[规则]
 
1、简单的makefile
test: test.o
gcc -o test test.o
 
test.o: test.c
gcc -c test.c -o test.o
 
clean:
rm test.o test
 
定义宏使makefile变的简化且灵活:
CC = gcc
CFLAGS = -Wall -O2 -g
TARGET = test
OBJS = test.o
SOURCES = test.c
INCPATH =
LIBPATH =
LIBS =
 
$(TARGET): $(OBJS)
$(CC) -o $(TARGET) $(OBJS)
 
$(OBJS): $(SOURCES)
$(CC) -o $(OBJS) -c $(SOURCES)
 
备注:
make程序在makefile文件中查找第一个目标,并构建它。如果要生成多个目标文件,则通常会创建一个依赖于所有目标文件的默认“哑元”目标(例如all),可以用来做接行符,语句太长的话可以分行。
 
all:
  target1
  target2 ...
 
target1: ...
[规则]
 
target2: ...
[规则]
 
也可以显式地说明要生成的目标make all,但这种方式多用于清除操作make clean(见上)
 
2、复杂的makefile
常用make指令和内部宏:
.SUFFIXES 
$<
$^
%
 
三、autoconfig和automake
阅读(409) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~