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语法基本一致。

基本选项

告警与错误选项

目录选项

链接方式选项

-f编译参数

静态库和动态库

创建静态库

使用ar命令(archive)把多个.o文件归档打包一起

ar rcs libout.a out1.o out2.o

创建动态库

g++ -fPIC -shared -o libshared.so shared1.o shared2.o

例子

libstatic_lib.a

libshared_lib.so

main

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来调试。

参考