设为首页 加入收藏

TOP

GCC在Linux编译时的简单用法
2014-11-24 07:32:35 来源: 作者: 【 】 浏览:0
Tags:GCC Linux 编译 时的 简单 用法

1.单个文件编译


编写源文件hello.c


编译:gcc hello.c


生成a.out


指定生成文件名:gcc -o test hello.c


生成test


2.编译成目标文件


编译:gcc -c hello.c


生成:hello.o


指定生成文件名:gcc -c -o test.o hello.c


编译:gcc -c file1.c file2.c file3.c


生成:file1.o file2.o file3.o


3.多文件编译


编写计算字符串长度函数string.c如下:


#define ENDSTRING '\0'
int StrLen(char *string)
{
int len=0;
while(*string++ != ENDSTRING)
len++;
return len;
}


编写主函数main.c 如下:


#include


extern int StrLen(char* str);


int mian(void)


{


char src[]="Hello Dymatic";
printf("string length is: %d\n",StrLen(src));
return 0;
}


编译:gcc -o test string.c main.c


生成:test


执行结果:string length is: 13


也可先生成目标文件:gcc -c string.c main.c


编译:gcc -o test string.o main.o


4.预编译处理


使用gcc的 -E选项告诉编译器进行预编译操作。


编译:gcc -E string.c


生成:string.i


查看:cat string.i


结果如下:


# 1 "string.c"
# 1 ""
# 1 ""
# 1 "string.c"


int StrLen(char *string)
{
int len=0;
while(*string++ != '\0')
len++;
return len;
}
可以发现ENDSTRING已经被'\0'替换。


5.编译成汇编语言


编译:gcc -S string.c


生成:string.s


查看结果:cat string.s


如下:


.file "string.c"
.text
.globl StrLen
.type StrLen, @function
StrLen:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $0, -4(%ebp)
jmp .L2
.L3:
addl $1, -4(%ebp)
.L2:
movl 8(%ebp), %eax
movzbl (%eax), %eax
testb %al, %al
setne %al
addl $1, 8(%ebp)
testb %al, %al
jne .L3
movl -4(%ebp), %eax
leave
ret
.size StrLen, .-StrLen
.ident "GCC: (GNU) 4.2.1"
.section .note.GNU-stack,"",@progbits


6.生成和使用静态链接库


生成静态库或者将一个obj文件加到已经存在的静态库的命令为" ar 库文件 obj1 obj2"。


将上面的string.o打包成库libstr.a命令如下:


ar -rcs libstr.a string.o


使用静态库如下:


gcc -o test main.c libstr.a 或 gcc -o test main.c lstr


应该你的运行会报错,没有找到lstr库,所以应该如下使用:


gcc -o test main.c -L ./ lstr //手动指定lstr库的位置。


7.生成和使用动态链接库


编译:gcc -shared -Wl,-soname,libstr.so -o libstr.so.1 string.c


选项中的soname表示别名为libstr.so,-o libstr.so.1表示实际名称为libstr.so.1,-shared表示生成ige动态链接库。


动态链接库的配置


动态链接库的搜索路径配置文件 : /etc/ld.so.conf


这个目录下存放可被linux共享的动态链接库所在目录名字,多个目录名间以空格 换行等空白字符 或是冒号或逗号隔开。


动态链接库管理命令:ldconfig


ldconfig的作用是在系统默认搜索路径,和动态链接库配置文件中所列出的目录里搜索动态链接库,创建动态链接装入程序需要的链接和缓存文件。搜索完毕将结果写入缓存文件/etc/ld.so.cache中,文件中保存的是已经安排好的动态链接库名字列表。


ldconfig -p //列出当前系统中的动态链接库


ldconfig -v //将扫描的动态链接库信息输出到终端


ldconfig 目录名 //将指定目录中的动态链接库放入系统中进行共享


使用动态链接库


编译:gcc -o test main.c -L./ -lstr


可能你的系统中test会报错,no such file or directory


程序编译时链接动态链接库和运行时使用动态链接库的概念不同。


运行时程序链接动态链接库需要在系统目录下才行。


有几种方法可解决此问题:


1.将动态链接库的目录放到程序搜索路径中,可加到环境变量LD_LIBARAY_PATH中实现。


LD_LIBARAY_PATH= /mydir: $LD_LIBARAY_PATH


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Ubuntu 10.10下编译内核Linux 2.6.. 下一篇Android和Android Linux kernel源..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 Python 进行数据 (2025-12-25 15:49:09)
·如何学习Python数据 (2025-12-25 15:49:07)
·利用Python进行数据 (2025-12-25 15:49:04)
·Java 学习线路图是怎 (2025-12-25 15:19:15)
·关于 Java 学习,有 (2025-12-25 15:19:12)