作为一名 Java 程序员,程序对 gcc 的员眼基本使用总是记不住,很不熟练,程序今天写篇文章用最简单的员眼方式记录下。 写个 hello.c 代码: #include #define STR "hello world\n" void main() { printf(STR); 第一步:预处理(preprocess) 其实就是以下三个动作: 第二步:编译(compile) 转换成汇编语言: 第三步:汇编(assemble) 转换成二进制(ELF relocatable): 第四步:链接(link) 具体分为动态链接和静态链接: # 动态链接 gcc hello.o -o hello # 静态链接 写一个加法函数: int add(int a, int b) { return a+b; 编译成 .o: 制作成静态库: 编写测试代码: #include void main(){ printf("%d", add(1,2)); 编译成可执行文件: #写法一 gcc test.c -o test libadd.a #写法二 执行: ./test 写一个加法函数: int add(int a, int b) { return a+b; 编译成 .o: 制作成动态库: 上面两步也可以直接从源文件一步到位: 编写测试代码: #include void main(){ printf("%d", add(1,2)); 编译成可执行文件: 执行发现报错: ./test error while loading shared libraries: libadd.so: 因为执行的服务器托管时候找不到指定的动态库。 那我们把 libadd.so 放在执行时的员眼动态库默认搜索路径下,比如 /lib64: 再次执行就成功了: ./test 查看二进制文件的程序链接信息,也可以发现我们的员眼 libadd.so 生效了: ldd test linux-vdso.so.1 => (0x00007ffe0f597000) libadd.so => /lib64/libadd.so (0x00007fa5ab29f000) libc.so.6 => /lib64/libc.so.6 (0x00007fa5aaed1000) 好了,以上就是亿华云程序编译、静态库制作、员眼动态库制作的程序过程,先记住这些 gcc 的员眼基本常识,再去研究原理吧!程序