标签:
控制台下的编译:
(实际苹果用的clang,将gcc换成clang也是一样的效果)
gcc [options] <inputs>
option常用的有
-o 链接
-c 将.c源文件编译成.o目标文件,不进行链接
gcc helloworld.c -c
将生成helloworld.o
需进一步输入
gcc helloworld.o -o helloworld
来生成最终的可执行文件helloworld。
而
gcc helloworld.c -c -o <随便一个名字>
能自定义生成的目标文件名称
-l(小写L)后接xxxx 表示调用libxxxx.yy 库
如果库不在系统默认的目录下要使用-L后接路径 再接-lxxxxx
-I(大写i)后接路径,表示在此路径下寻找头文件 xxxx.h
ar -rcs libxxxx.a aaaa.o bbbb.o ccccc.o ...etc
r:如果目标文件存在就刷新它
c:创建后不显示反馈信息
s:在文件开头建立索引
不同操作系统的动态链接库后缀不相同
Windows里动态链接库后缀为 .dll(Dynamic Link Library)
Linux里后缀为 .so
Mac里后缀为 .dylib
创建:(生成的动态链接库后缀跟随系统)
gcc -shared <FileName>.o livxxxx.dylib
使用:
和静态库一样
使用 nm 指令查看库
==================================
实例测试
~/Desktop/codeC 下有3个文件 main.c test.c/.h
test文件内有一函数print_hello,作用是打印"Hello World!"
main.c中include了test.h并调用了print_hello
先将test.c/.h制成动态链接库:
gcc test.c -c //此操作在当前目录下生成test.o gcc -shared test.o -o libhello.dylib //此操作在当前目录下生成lib hello.dylib
链接并生成可执行文件
gcc main.c -c //生成main.o gcc main.o -L. -lhello -o helloworld //生成helloworld
./helloworld //控制台输出helloworld字样
现在更改一下链接的库:
有一对test2.c/.h文件,里面也有一个print_hello函数,但作用是打印"How Are You"
用该文件生成同样名称的动态链接库:
gcc test2.c -c //生成test2.o gcc -shared test2.o -o libhello.dylib //重新生成了同名动态链接库
然后直接运行原来的那个helloworld程序:
./helloworld
控制台输出了"How Are You",而不是“Hello World"了,即使main函数的代码没有改变也没有重新编译。
标签:
原文地址:http://www.cnblogs.com/makejeffer/p/4856406.html