对第一次接触linux下C/C++使用g++和gcc编译时遇到的各种情况进行了一定总结:
单文件编译运行
1.g++ -E filename.c -o filename.i 将c文件转化成C++文件,这个过程也叫做预处理过程 2.g++ -S filename.i -o filename.s 将预处理过程生成的.i后缀的文件转化成汇编文件,里面存储的是相应的汇编代码,这个过程叫做编译。 3.g++ -c filename.s -o filename.o 将汇编文件中的汇编代码翻译成相应的机器语言,这个过程叫做汇编。 4.g++ filename.o -o filename 这条指令是完成链接这个过程的,它通过链接器ld将运行程序的目标文件和库文件链接在一起,生成最后的可执行文件 5.生成可执行文件后,我们就能够调用相应的程序了。 ./filename
静态库和动态库
1. 静态库
g++ -c StaticMath.cpp 将代码文件编译成目标文件
linux下静态库命名规范 必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a
然后,通过ar工具将目标文件打包成.a静态库文件 ar -crv libstaticmath.a StaticMath.o
生成静态库libststicmath.a
example:
- gedit main.cpp 创建main文件
- gedit add.h 创建头文件
- gedit add.cpp 创建关联文件
- g++ -c add.cpp 汇编
- ar -rcs libadd.a add.o 生成静态库
- g++ -o main main.cpp -L ./ -ladd 链接主文件/编译/汇编/链接
- ./main 调用可执行文件
2. 动态库
下面我们来生成一个动态库:
输入:g++ -fPIC -shared -o libadd.so add.cpp
这样就生成了一个libadd.so的动态库
下面我们用动态链接的方式编译test.cpp。
输入:g++ -o test test.cpp -L . -ladd
该命令和刚刚静态链接一样。注意-l后面接的是lib与so中间的库名称
example:
gedit main.cpp
gedit mylib.h
gedit add.cpp
gedit sub.cpp
g++ -fpic -shared add.cpp sub.cpp -o libmy.so
(gcc -fpic -c add.c
gcc -fpic -c sub.c
gcc -shared -fpic -o libtiger.so tiger.o
gcc -shared -o libtiger.so add.o sub.o ) 等价
g++ -o main main.cpp -Wl,-rpath=. -L ./ -lmy
(export LD_LIBRARY_PATH=.) 等价
./main
关于本博客的任何问题欢迎通过Mars_zhewei@outlook.com与本人交流。
|