废话少说,直接上干货:
首先在/usr/zdd/desktop/创建一个a.c文件,打开终端cd /usr/zdd/desktop/
直接上命令gcc -c a.c -o a.o 编译成a.o文件。
(如果是JAVA项目或者Android JNI项目中防止会有报jni.h not found和jni_md.h not found错误,解决办法是:
gcc -I /Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home/include -I /Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home/include/darwin -c a.c -o a.o
此时,.o文件已生成。最后一步gcc a.o -dynamiclib -o liba.dylib 即大功告成。
(注:多个c文件,需要分别生成.o文件 通过 gcc a.o b.o c.o d.o -dynamiclib -o lib.dylib)
附:GCC常用命令解析
我们以Hello world程序来开始我们的学习。代码如下:
/* hello.c */
#include <stdio.h>
int main(void)
{
printf ("Hello world!\n");
return 0;
}
1. 执行如下命令:$ gcc -o hello hello.c
运行如下 : $ ./hello
输出: Hello,world!
2. 我们也可以分步编译如下:
(1) $ gcc –E hello.c -o hello.i
//预处理结束
//这时候你看一下hello.i ,可以看到插进去了很多东西。
(2) $ gcc –S hello.i
//生成汇编代码后结束
(3) $ gcc –c hello.c
或者:
$ gcc -c hello.c –o hello.o
或者:
$ gcc -c hello.i -o hello.o
//编译结束
//生成 hello.o文件
(4) $ gcc hello.o –o hello.o
或者:
$ gcc –o hello hello.c
//链接完毕,生成可执行代码
3. 我们可以把几个文件一同编译生成同一个可执行文件。
比如:一个工程有main.c foo.c def.c生成foo的可执行文件。
编译命令如下:
$ gcc –c main.c foo.c def.c –o foo
或者:
$ gcc –o foo main.c foo.c def.c
三.库依赖
函数库是一些头文件(.h)和库文件(.so或者.a)的集合。Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并非绝对如此。因此GCC设有添加头文件和库文件的编译选项开关。
1. 添加头文件:-I
例如在/home/work/include/目录下有编译foo.c所需头文件def.h,为了让GCC能找到它们,就需要使用-I选项:
$ gcc foo.c -I /home/work/include/def.h -o foo
2. 添加库文件:-L
例如在/home/work/lib/目录下有链接所需库文件libdef.so,为了让GCC能找到它们,就需要使用-L选项:
$ gcc foo.c –L /home/work/lib –ldef.a –o foo
说明:-l选项指示GCC去连接库文件libdef.so。Linux下的库文件命名有一个约定,即库文件以lib三个字母开头,因为所有的库文件都遵循这个约定,故在用-l选项指定链接的库文件名时可以省去lib三个字母。
[题外语]
Linux下的库文件分为动态链接库(.so文件)和静态链接库(.a文件)。GCC默认为动态库优先,若想在动态库和静态库同时存在的时候链接静态库需要指明为-static选项。比如上例中如还有一个libdef.a而你想链接libdef.a时候命令如下:
$ gcc foo.c –L /home/work/lib –static –ldef.a –o foo