gcc命令行指令

案例目录结构如下:
├── include
│   └── swap.h
├── main.cpp
└── src
└── swap.cpp

直接编译

g++ main.cpp src/swap.cpp -Iinclude

带参数编译

g++ main.cpp src/Swap.cpp -Iinclude -std=c++11 -O2 -Wall -o b.out

生成库文件并编译

链接静态库生成可执行文件
$cd src
# 汇编,生成 .o 可执行文件
g++ swap.cpp -c -I../include
# 生成 .a 静态库
ar rs libswap.a swap.o

$cd ..
# 链接,生成可执行文件 staticmain
g++ main.cpp -Iinclude -Lsrc -lswap -o staticmain
链接动态库生成可执行文件
$cd src
# 生成 .so 动态库文件
g++ swap.cpp -I../include -fPIC -shared -o libswap.so
## 等价于
# g++ swap.cpp -I../include -c -fPIC
# g++ -shared -o libswap.so swap.o

$cd ..
# 链接,生成可执行文件 sharemain
g++ main.cpp -Iinclude -Lsrc -lswap -o sharemain
  • 注意
    如果使用自己手动生成的动态链接库.so文件,但是这个.so文件,没有加入库文件搜索路劲中,程序运行时可能会出现找不到动态链接库的情形。

参数

option description
-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 *.o
-l (lower(L)) 在链接时告诉链接器要用到哪个库。 如:-l pthread; 即告诉链接器,程序需要链接pthread这个库。这里的pthread是库名不是文件名,文件名是libpthread.so
-L 添加链接库路径. 如:-L /home/hello/lib
-I (upper(i)) 在编译时用,告诉编译器去哪个路径下找文件, 编译器的寻找顺序是:/home/hello/include-->/usr/include-->/usr/local/include。如果在/home/hello/include中有个文件hello.h,则在程序中用#include就能引用到这个文件
-fPIC 编译器就输出位置无关目标码.适用于动态连接(dynamic linking),即使分支需要大范围转移.
-shared (-G) 此选项将尽量使用动态库,为默认选项; 优点:生成文件比较小; 缺点:运行时需要系统提供动态库
-o 制定目标名称,缺省的时候,gcc 编译出来的文件是a.out
posted @ 2022-03-28 15:46  levylaw  阅读(66)  评论(0编辑  收藏  举报