g++的使用

g++

  • GCC(GNU Compiler Collection)
  • gcc(GNU C Compiler)
  • g++(GNU C++ Compiler)

源文件生成可执行文件的过程

  • 预处理(Preprocess)
  • 编译(Compile)
  • 汇编(Assemble)
  • 链接(Link)
文件 过程 输出 命令 工具
.h、.c、.cpp →      
  Preprocess   g++ -E source.cpp -o target.ii cpp
  → .ii    
  Compile

 

g++ -S source.cpp

cc
  → .s    
  Assemble   g++ -c source.cpp as
  → .o    
.a、.so → Link     ld
  → 无扩展名    

静态链接库与动态链接库的区别

  • 静态链接库:在链接阶段,和目标文件(.o)一起链接到可执行文件中,由于可执行文件中已经包含静态链接库内容,因此在可执行文件执行时无需静态链接库文件
  • 动态链接库:在整个编译阶段,并不链接到可执行文件中,而是在可执行文件执行时才被链接,由于可执行文件中不包含静态链接库内容,因此在可执行文件执行时仍需要动态链接库文件

单个C++源文件(.cpp文件)生成可执行文件

包含main函数的可独立运行的单个C++源文件,通过如下方式生成可执行文件:

g++ -o filename2 filename1.cpp

filename1.cpp:源文件

filename2:生成的可执行文件名称

-o:用于指定生成的可执行文件名称(若无此参数则生成文件默认名称为a)

多个C++源文件(.cpp文件)生成可执行文件

多个C++源文件,main函数在其中之一且各文件运行存在依赖关系,通过如下方式生成可执行文件:

g++ -o filename3 filename1.cpp filename2.cpp

filename1.cpp、filename2.cpp:源文件(在命令行中以任意顺序排列均可)

filename3:生成的可执行文件名称

需要注意的是,参与生成可执行文件的源文件中必须有且仅有一个包含main函数

多个C++源文件(.cpp文件)生成目标文件(.o)

多个C++源文件,通过如下方式生成目标文件:

g++ -c filename1.cpp filename2.cpp

命令行中的每个源文件都将会生成与之同名的一个目标文件

多个C++源文件(.cpp文件)生成静态链接库(.a)

多个C++源文件,通过如下方式生成静态链接库:

  • 首先生成各源文件的目标文件(.o文件)
g++ -c filename1.cpp filename2.cpp
  • 然后将多个目标文件生成静态链接库
ar -r libfilename3.a filename1.o filename2.o

filename1.cpp、filename2.cpp:源文件

filename1.o、filename2.o:目标文件

libfilename3.a:生成的静态链接库(静态链接库需要以lib开头来命名且扩展名为.a)

注意,用于生成静态链接库的文件为目标文件而非源文件,注意与动态链接库的生成相区别

编译中使用静态链接库(.a)

编译中使用静态链接库,通过如下方式生成可执行文件:

g++ -o filename2 filename1.cpp -Lpathname -lfilename3

filename1:源文件

filename2:编译生成的可执行文件名称

-lfilename3:静态链接库名称(需去掉静态链接库名称前的lib并加上-l且无.a扩展名,注意与上面的libfilename3.a相区别)

-Lpathname:编译时链接的静态链接库所在路径(若静态链接库与源文件处于相同目录则路径则pathname可写为“.”)

注意,源文件filename1.cpp需要放在静态链接库filename3之前,否则报错

多个C++源文件(.cpp文件)生成动态链接库(.so)

多个C++源文件,通过如下方式生成动态链接库:

g++ -o libfilename3.so filename1.cpp filename2.cpp -fPIC -shared

filename1.cpp、filename2.cpp:源文件

libfilename3.so:生成的动态链接库(动态链接库需要以lib开头来命名且扩展名为.so)

-fPIC:表示编译为位置独立的代码以实现代码段共享的目的

-shared:表示生成动态链接库

注意,用于生成动态链接库的文件为源文件而非目标文件,注意与静态链接库的生成相区别

编译中使用动态链接库(.so)

编译中使用动态链接库,通过如下方式生成可执行文件:

g++ -o filename2 filename1.cpp -Lpathname1 -lfilename3 -Wl,--rpath=pathname2

filename1.cpp:待编译且运行过程中链接动态链接库的源文件

filename2:编译生成的可执行文件名称

-lfilename3:动态链接库名称(需去掉动态链接库名称前的lib并加上-l且无.so扩展名,注意与上面的libfilename3.so相区别)

-Lpathname1:编译时链接的动态链接库所在路径(若动态链接库与源文件处于相同目录则路径pathname可写为“.”)

-Wl,--rpath=pathname2:可执行文件运行时动态链接库所在路径(注意与编译时链接的动态链接库所在路径的区别,-L指出的路径要求编译时动态链接库在此路径下,而此处指出的路径为编译完成的可执行文件在运行时链接动态链接库的路径)

posted @ 2020-12-24 15:50  溪嘉嘉  阅读(760)  评论(0编辑  收藏  举报