g++基础使用以及如何生成静态链接库和动态链接库

参考:https://blog.csdn.net/woshinia/article/details/11060797?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

.cpp .c ->预处理 -> 编译成汇编语言 ->汇编成目标文件 ->连接成可执行文件

g++ :

-E : 只做预处理,得到.i文件

-S :编译,得到的文件是汇编语言文件 .s

-c :汇编成目标文件 .o

-L :连接

-o :后面加输出的文件名(-o可以穿插在g++指令中的任何一个位置,在文件前面,后面,或者两个文件中间)

不加参数的话就是完成上述所有过程(预处理、编译、汇编、连接),如果需要连接的话,后面可以跟多个文件。最后生成可执行文件。一般用-o指定文件名,如果没有指定,会生成同名的.out文件

注意大小写

1.预处理,生成.i的文件[预处理器cpp]

命令:g++ -E Test.cpp 如果想把预处理后的文件保存出来到文件可以在后面加上 > Test.i(输出重定向)或者 -o Test.i

功能:输出预处理后的文件,linux下以.i为后缀名。只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里 。这一步主要做了这些事情:宏的替换,还有注释的消除,还有找到相关的库文件。用编辑器打开Test.i会发现有很多很多代码,你只需要看最后部分就会发现,预处理做了宏的替换,还有注释的消除,可以理解为无关代码的清除。下面是Test.i文件的最后部分,可以看见宏的替换和注释的消除。

2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]

命令:g++ -S Test.cpp (-o Test.s)

功能:会生成Test.s文件,.s文件表示是汇编文件,用编辑器打开就都是汇编指令。

3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]

命令:g++ -c Test.cpp  (-o Test.o)

功能:.o是GCC生成的目标文件,除非你是做编译器和连接器调试开发的,否则打开这种.o没有任何意义。二进制机器码一般人也读不了。

4.连接目标代码,生成可执行程序[链接器ld]

命令:g++ Test.o -L F:\vs2008\VC\include\iostream

功能:将.o文件与所需的库文件链接整合形成.exe文件,这就是可执行文件。-L 表示链接,这里我后面写的是绝对路径,相对各人电脑不同

在上面各个步骤中你可以用-o命令输出你自己想要的各种名字。比如最后一个命令,用下面的输出Test.exe

你可以g++ Test.o -o Test.exe -L F:\vs2008\VC\include\iostream

5.执行

./ Test.exe

1.如果只有一个文件,且不需要库文件,则可以直接生成可执行文件

g++ -o main main.cpp

2.如果需要把文件编译库文件

无论是静态库文件还是动态库文件,都是由 .o 文件创建的,所以第一步先编译成.o目标文件

库文件的命名规范是以 lib 开头(前缀),紧接着是后缀名,静态链接库以 .a 为后缀名 ,动态链接库以.so为后缀名

(1)动态链接库

例一;

g++ -fPIC -o math.o -c math.cpp

g++ -shared -o libmath.so math.o

也可以直接一条命令搞定:

g++ -fPIC -shared -o libmath.so math.cpp

例二:

g++ fPIC -o add.o -c add. cpp

g++ fPIC -o sub.o -c sub.cpp

g ++ -shared -o libmymath.so add.o sub .o

也可以直接一条命令搞定:

g++ -fPIC -shared -o libmymath.so add.cpp sub.cpp

-fPIC :表示编译为位置独立的代码。 不用此选项的话编译后的代码是位置相关 的,所以动态载入时是通过代码复制的方式 来满足不同进程的需要,而不能达到真正代 码段共享的目的。

(2)静态链接库

g++ -c math.o math.cpp

用ar工具:

av -cr libmath.a math.o

ar命令的 r选项:在库中插入模块(替换)。 当插入的模块名已经在库中存在,则替换同名的模块。 如果若干模块中有一个模块在库中不存在, ar 会显示一个错误消息,并不替换其 他同名模块。 默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加 的位置。

ar 命令的 c 选项:创建一个库。不管库是否存在,都将创建。

(3)使用库文件

静态库:g++ -o main main.cpp -L libmath.a 这样main.cpp文件中可以使用libmath.a库中的函数

动态库:方法相同

发布了59 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/sinat_41852207/article/details/104846327