g++编译规则

1. 基本规则

  • -c : 生成目标文件,只编译不链接,即链接库文件之前的文件,后缀一般为 .o

      g++ -c main.cpp // 会生成 main.o 的目标文件
    
  • -o:生成可执行文件。

      g++ -o main main.cpp -L. -lstaticlib // 利用源文件 main.cpp 与./ 中的库文件一起生成可执行文件 main
    
  • -L: 要链接的库文件所在目录。

      -L. //库在当前目录
      -L/usr/lib
    
  • -l: 需要链接的库的名称。注意不是库文件名称,例如 libtest.a 是静态库文件名称,其 对应的库名称为 test。因为在 linux 中编译时库文件的命名为 lib[库名称].a 或者 lib[库名称].so ,前者为静态库,后者为动态库。

  • -I: 指定头文件目录。可以使用相对路径,即:

      -I./include
      -I/usr/include
    
  • -shared:指定生成动态库。

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


2. 使用示例

Windows下Ipopt优化库安装 中有大量实例显示如何用 g++ 编译。

  • 创建静态库文件。

    1. 先生成目标文件:
     g++ -c file1.cpp  
    
    1. 利用目标文件创建静态库。其中静态库名字为 xxxx,库文件名字为 libxxxx.a 。在生成可执行文件时需要用 -lxxxx
     ar  cqs  libxxxx.a  xx1.o xx2.o xx3.o
    
  • 创建动态库文件:

    1. 直接利用源文件生成动态库文件。库名称和库文件名称区别如上。
      g++ -fPIC -shared -o libxxxx.so xx1.cpp xx2.cpp xx3.cpp
    
  • 链接库文件,创建可执行文件。

     g++ -o main main.cpp -LfilePath -lxxxx