As a Java programmer , yes gcc I can't remember the basic use of , Very unskilled , Write an article today and record it in the simplest way .
Compilation process
Write a hello.c code
#include <stdio.h> #define STR "hello world\n" void main() { printf(STR); }
First step : Pretreatment (preprocess)
It's actually the following three actions
1. Header file expansion
2. Macro definition direct replacement
3. If conditional compilation does not hold, remove it
gcc -E hello.c -o hello.i
Step two : compile (compile)
Convert to assembly language
gcc -S hello.i -o hello.s
Step 3 : assembly (assemble)
Convert to binary (ELF relocatable)
gcc -c hello.s -o hello.o
Step 4 : link (link)
It is divided into dynamic link and static link
# dynamic link gcc hello.o -o hello # Static link gcc hello.o -o hello -static
Static library production
Write an addition function .
int add(int a, int b) { return a+b; }
Compile into .o
gcc -c add.c -o add.o
Make it into a static library
ar rcs libadd.a add.o
Write test code
#include <stdio.h> void main(){ printf("%d", add(1,2)); }
Compile into executable
# Writing method I gcc test.c -o test libadd.a # Writing method 2 gcc test.c -o test -static -ladd -L ./
implement
./test 3
Dynamic library making
Write an addition function .
int add(int a, int b) { return a+b; }
Compile into .o
gcc -c add.c -o add.o -fPIC
Make it into a dynamic library
gcc -shared -o libadd.so add.o
The above two steps can also be done directly from the source file in one step
gcc -fPIC -shared -o libadd.so add.c
Write test code
#include <stdio.h> void main(){ printf("%d", add(1,2)); }
Compile into executable
gcc test.c -o test -ladd -L ./
Error reporting during execution
./test error while loading shared libraries: libadd.so:
cannot open shared object file: No such file or directory
Because the specified dynamic library cannot be found during execution .
Then let's take libadd.so Put it under the default search path of dynamic library during execution , such as /lib64
cp libadd.so /lib64
Execute it again and it will succeed
./test 3
View binary link information , You can also find our libadd.so It's working .
ldd test linux-vdso.so.1 => (0x00007ffe0f597000)
libadd.so => /lib64/libadd.so (0x00007fa5ab29f000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa5aaed1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa5ab4a1000)
okay , The above is compilation , Static library production , The process of making dynamic library , Remember this first gcc Basic knowledge of , Want more knowledge , plus QQ group :873250202 receive !
Technology
Daily Recommendation