Unix下大家一般都用cc进行编译,而LINUX下绝大多数软件都是用gcc编译,编译参数也有细节差异。
仅列举一二:
1、 -lsocket
unix 如果用到socket的话,makefile需要加上 -lsocket,在linux中不再需要,因为,linux中libc.so里已包含含socket相关。
2、 编译成so
${CC} -o $@ -shared -fPIC ${OBJECT}
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接,相当于一个可执行文件。
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
3、使用so
-L${HOME}/lib -lxml
-L${HOME}/lib :表示要连接的库在$HOME/lib中
-lxml:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库名称,例如libxml.so
LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
4、main()函数
gcc要求main必须返回int,cc无此要求。