gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,在linux平台下一般使用gcc工具链。在Mac下目前已经慢慢替换为LLVM的clang工具链。
gcc/g++ 入门
基本使用
语法:
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
g++与gcc语法基本一致。
基本选项
-c
编译源文件,生成.o文件-o
指定生成文件名-Dmacro[=defn]
指定预处理器的宏定义-g
在编译的时候产生调试信息-S
编译成汇编文件-Olevel
编译器优化级别,level支持0~3,-O
默认为-O1
,-O0
表示不优化
告警与错误选项
-w
关闭所有警告,建议不要使用此项-Wall
一般使用该选项,允许发出GCC能够提供的所有有用的警告。-Werror
把所有警告转换为错误
目录选项
-Idir
指定头文件的搜索目录-Ldir
指定库文件的搜索目录-llibrary
指定编译时使用的库
链接方式选项
-static
编译为静态库-shared
编译为动态库-fPIC
编译器就输出位置无关目标码,适用于生成动态链接库(dynamic linking)
-f
编译参数
-fno-rtti
禁用C++虚函数的运行时信息(typeid将不能使用),可以减小最终链接生成的对象大小。
静态库和动态库
创建静态库
使用ar
命令(archive)把多个.o文件归档打包一起
ar rcs libout.a out1.o out2.o
创建动态库
g++ -fPIC -shared -o libshared.so shared1.o shared2.o
例子
libstatic_lib.a
static_lib.h
int minus(int a, int b);
static_lib.cc
#include "static_lib.h" int minus(int a, int b) { return a-b; }
libshared_lib.so
shared_lib.h
#if defined(SHARED_IMPLEMENT) #define SHARED_EXP __attribute__((visibility("default"))) #else #define SHARED_EXP #endif SHARED_EXP int add(int a, int b);
shared_lib.cc
#include "shared_lib.h" int add(int a, int b) { return a+b; }
main
main.cpp
#include <iostream> #include "static_lib.h" #include "shared_lib.h" int main() { std::cout << add(3,4) << "\n"; std::cout << minus(10,4) << "\n"; return 0; }
Makefile
objects = main.o
static_objs = static_lib.o
shared_objs = shared_lib.o
main : $(objects) static_lib shared_lib
g++ -o main $(objects) -L ./lib -lshared_lib -lstatic_lib
shared_lib : $(shared_objs) init_dir
g++ -fPIC -shared -DSHARED_IMPLEMENT -o lib/libshared_lib.so $(shared_objs)
static_lib : $(static_objs) init_dir
ar rcs lib/libstatic_lib.a $(static_objs)
$(objects) : %.o : %.cpp
g++ -g -c $< -o $@
$(shared_objs) : %.o : %.cc
g++ -g -c $< -o $@
$(static_objs) : %.o : %.cc
g++ -g -c $< -o $@
init_dir:
-mkdir lib
clean :
rm main $(objects) $(static_objs) $(shared_objs)
rm -rf lib
startup.sh
#!/bin/bash
export LD_LIBRARY_PATH="$(pwd)/lib":$LD_LIBRARY_PATH
./main
运行:
$ make
g++ -c -o main.o main.cpp
g++ -c -o static_lib.o static_lib.cc
mkdir lib
ar rcs lib/libstatic_lib.a static_lib.o
g++ -c -o shared_lib.o shared_lib.cc
g++ -fPIC -shared -DSHARED_IMPLEMENT -o lib/libshared_lib.so shared_lib.o
g++ -o main main.o -L ./lib -lshared_lib -lstatic_lib
$ ./startup.sh
7
6
注意:使用-g
命令编译生成.o
文件,然后再链接到so和exec,就可以用于gdb来调试。
参考
- http://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html
- http://stackoverflow.com/questions/2734719/how-to-compile-a-static-library-in-linux
- http://blog.xuite.net/csiewap/cc/23626229-Using+GCC+to+create+static+and+shared+library+.so
- http://blog.csdn.net/zhuxiaoyang2000/article/details/5575194
- http://man.linuxde.net/gcc
- http://blog.csdn.net/ast_224/article/details/3988244