GCC常用参数
gcc常用参数
-g
-w
-I
-l
-L
-fPIC
-shared
-std=c11
-std=c99
-D
1、C的Makefile
CC=gcc
CFlagesDebug=-g -w -ggdb -std=c11 -c
#src=fig1.8_P14IntCell.c
#src+=fig1.11_P18.c
#srcPath=./Chapter01
#src=$(srcPath)/fig1.8_P14IntCell.c
#src+=$(srcPath)/fig1.11_P18.c
Project=execute
src=$(wildcard *.c)
obj=$(src:.c=.o)
$(Project):$(obj)
$(CC) -o $(Project) $(obj)
%.o:%.c
$(CC) -MM $^
$(CC) $(CFlagesDebug) $^ -o $@
.PHONY:cleanDotObjs
cleanDotObjs:
-rm -f $(obj)
.PHONY:cleanDotExecute
cleanDotExecute:
-rm -f $(Project)
.PHONY:clean
clean:cleanDotObjs cleanDotExecute
2、C++的Makefile
模板1
PROJECT = execute
SrcSuf = c
SrcSuf2 = cpp
SrcSuf3 = cc
ObjSuf = o
LibSuf = so
LibSuf2 = a
OBJFILES = ./TcpDataChannel.$(ObjSuf)
OBJFILES += ./main.$(ObjSuf)
OBJFILES += ./utils.$(ObjSuf)
OBJFILES += ./zinx.$(ObjSuf)
INCLUDEPATH = -I /usr/include/
INCLUDEPATH += -I /usr/local/include
LIBPATH = -L /usr/local/lib/
LIBPATH += -L /usr/lib/
CC = g++
CFlag = $(INCLUDEPATH) -w -g -ggdb -fshort-wchar -std=c++11 -pthread
LDFLAGS += $(LIBPATH)
LDFLAGS += -l pthread
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf) .$(SrcSuf2) .$(LibSuf2) .$(SrcSuf3)
all: $(PROJECT) clean
$(PROJECT):$(OBJFILES)
@echo "creating $(PROJECT) start..."
$(CC) $(LDFLAGS) $(OBJFILES) -o $(PROJECT)
@echo "creating $(PROJECT) end"
.$(SrcSuf).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CC) $(CFlag) -c $< -o $@
.$(SrcSuf2).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CXX) $(CFlag) -c $< -o $@
.$(SrcSuf3).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CXX) $(CFlag) -c $< -o $@
clean:
@echo "Cleaning $(PROJECT) project files"
@rm -f $(OBJFILES) core
.PHONY:cleanobj
cleanobj:
-rm -f $(OBJFILES)
.PHONY:cleanexe
cleanexe:
-rm -f $(PROJECT)
.PHONY:cleanall
cleanall:cleanobj cleanexe
模板2
CXX=g++
CxxFlagesDebug=-g -w -ggdb -std=c++11 -fshort-wchar -c
#src=fig1.8_P14IntCell.cpp
#src+=fig1.11_P18.cpp
#srcPath=./Chapter01
#src=$(srcPath)/fig1.8_P14IntCell.cpp
#src+=$(srcPath)/fig1.11_P18.cpp
Project=execute
src=$(wildcard *.cpp)
obj=$(src:.cpp=.o)
$(Project):$(obj)
$(CXX) -o $(Project) $(obj)
%.o:%.cpp
$(CXX) -MM $^
$(CXX) $(CxxFlagesDebug) $^ -o $@
.PHONY:cleanDotObjs
cleanDotObjs:
-rm -f $(obj)
.PHONY:cleanDotExecute
cleanDotExecute:
-rm -f $(Project)
.PHONY:clean
clean:cleanDotObjs cleanDotExecute
3、C libxxx.a 的Makefile
PROJECT = libcalc
OUTNAME = $(PROJECT).a
INCLUDEPATH = -I./include/
SrcSuf = c
ObjSuf = o
LibSuf = so
OBJFILES = ./add.$(ObjSuf)\
./div.$(ObjSuf)\
./mult.$(ObjSuf)\
./sub.$(ObjSuf)\
CC = gcc
LD = ar rcs
CFlag = -w -g -ggdb -fshort-wchar -std=c11 $(INCLUDEPATH)
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf)
all: $(PROJECT) clean
$(PROJECT):$(OBJFILES)
@echo "Linking $(OUTNAME) start..."
$(LD) $(OUTNAME) $(OBJFILES)
@echo "Linking $(OUTNAME) end"
clean:
@echo "Cleaning $(PROJECT) project files"
@rm -f $(OBJFILES) core
.$(SrcSuf).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CC) -c $< -o $@ $(CFlag)
PROJECT = execute
SrcSuf = c
ObjSuf = o
LibSuf = so
OBJFILES = ./main.$(ObjSuf)\
INCLUDEPATH = -I../include/
LIBPATH= -L../
LIBS=../libcalc.a
CC = gcc
CFlag = -w -g -ggdb -fshort-wchar -std=c11 $(INCLUDEPATH)
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf)
all: $(PROJECT) clean
$(PROJECT):$(OBJFILES)
@echo "creating $(PROJECT) start..."
$(CC) $(OBJFILES) -o $(PROJECT) $(INCLUDEPATH) $(LIBPATH) $(LIBS)
@echo "creating $(PROJECT) end"
clean:
@echo "Cleaning $(PROJECT) project files"
@rm -f $(OBJFILES) core
.$(SrcSuf).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CC) -c $< -o $@ $(CFlag)
4、C libxxx.so 的Makefile
PROJECT = libcalc
OUTNAME = $(PROJECT).so
INCLUDEPATH = -I./include/
CC = gcc
LD = gcc
LIBEXPORT = -fvisibility=hidden
.DEFINES = -DTRACE_LOG
CFlag = -w -g -ggdb -fshort-wchar -std=c11 -fPIC $(INCLUDEPATH)
CxxFlage = -shared $(LIBEXPORT) $(.DEFINES)
SrcSuf = c
ObjSuf = o
LibSuf = so
OBJFILES = ./add.$(ObjSuf)\
./div.$(ObjSuf)\
./mult.$(ObjSuf)\
./sub.$(ObjSuf)\
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf)
all: $(PROJECT) clean
$(PROJECT):$(OBJFILES)
@echo "Linking $(OUTNAME) start..."
$(LD) $(OBJFILES) -o $(OUTNAME) $(CxxFlage) -ldl
@echo "Linking $(OUTNAME) end"
clean:
@echo "Cleaning $(PROJECT) project files"
@rm -f $(OBJFILES) core
.$(SrcSuf).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CC) -c $< -o $@ $(CFlag)
PROJECT = execute
SrcSuf = c
ObjSuf = o
LibSuf = so
OBJFILES = ./main.$(ObjSuf)
INCLUDEPATH = -I../include/
LIBPATH = -L../
LIBS2 = -l calc
CC = gcc
CFlag = -w -g -ggdb -fshort-wchar -std=c11 $(INCLUDEPATH)
CxxFlage = $(INCLUDEPATH) $(LIBPATH)
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf)
all: $(PROJECT) clean
$(PROJECT):$(OBJFILES)
@echo "creating $(PROJECT) start..."
$(CC) $(OBJFILES) -o $(PROJECT) $(CxxFlage) $(LIBS2)
@echo "creating $(PROJECT) end"
clean:
@echo "Cleaning $(PROJECT) project files"
@rm -f $(OBJFILES) core
.$(SrcSuf).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CC) -c $< -o $@ $(CFlag)
5、C++ libxxx.so 的Makefile
PROJECT = libzinx
OUTNAME = $(PROJECT).so
SrcSuf = c
SrcSuf2 = cpp
SrcSuf3 = cc
ObjSuf = o
LibSuf = so
LibSuf2 = a
OBJFILES = ./TcpDataChannel.$(ObjSuf)
OBJFILES += ./utils.$(ObjSuf)
OBJFILES += ./zinx.$(ObjSuf)
INCLUDEPATH = -I /usr/include/
INCLUDEPATH += -I /usr/local/include
LIBPATH = -L /usr/local/lib/
LIBPATH += -L /usr/lib/
CC = g++
CXX = g++
LD = g++
CFlag = $(INCLUDEPATH) -w -g -ggdb -fshort-wchar -std=c++11 -fPIC -pthread
LIBEXPORT = -fvisibility=hidden
.DEFINES = -DTRACE_LOG
LDFLAGS += $(LIBPATH)
LDFLAGS += -l pthread
LDFLAGS += -shared $(LIBEXPORT) $(.DEFINES)
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf) .$(SrcSuf2) .$(LibSuf2) .$(SrcSuf3)
all: $(OUTNAME) clean
$(OUTNAME):$(OBJFILES)
@echo "creating $(OUTNAME) start..."
$(LD) $(OBJFILES) -o $(OUTNAME) $(LDFLAGS) -ldl
@echo "creating $(OUTNAME) end"
strip $(OUTNAME)
.PHONY : install
install:$(OUTNAME)
cp $^ /usr/lib/
cp *.h /usr/include/
.$(SrcSuf).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CC) $(CFlag) -c $< -o $@
.$(SrcSuf2).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CXX) $(CFlag) -c $< -o $@
.$(SrcSuf3).$(ObjSuf):
@echo "Compiling $(PROJECT) $<"
$(CXX) $(CFlag) -c $< -o $@
clean:
@echo "Cleaning $(PROJECT) project files"
@rm -f $(OBJFILES) core
.PHONY:cleanobj
cleanobj:
-rm -f $(OBJFILES)
.PHONY:cleanexe
cleanexe:
-rm -f $(PROJECT)
.PHONY:cleanall
cleanall:cleanobj cleanexe
[root@lwh CreateZinxTcp]
-rwxr-xr-x. 1 root root 278K Oct 10 00:10 libzinx.so
[root@lwh CreateZinxTcp]
libzinx.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=cb36f4698281384fe7b3b4782006e6a9a55482d2, not stripped
[root@lwh CreateZinxTcp]
[root@lwh CreateZinxTcp]
libzinx.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=cb36f4698281384fe7b3b4782006e6a9a55482d2, stripped
[root@lwh CreateZinxTcp]
-rwxr-xr-x. 1 root root 76K Oct 10 00:10 libzinx.so
5. Makefile GCC G++常用选项
CFLAGS
CFLAGS
-fvisibility=hidden
-g
-Wall
-O
-O2
-fvisibility=hidden
在linux下,源文件中的所有函数都有一个默认的visibility属性为public,(此时函数对外是可见的)
在编译命令中加入-fvisibility=hidden参数,会将所有默认的public的属性变为hidden;(此时函数对外是不可见的)
此时,如果对函数设置__attribute__ ((visibility(“default”)))参数,使特定的函数仍然按默认的public属性处理,
则-fvisibility=hidden参数不会对该函数起作用。(此时函数对外是可见的)
所以,设置了-fvisibility=hidden参数之后,只有设置了__attribute__ ((visibility(“default”)))的函数才是对外可见的,如此则效果等同于Visual Studio下的__declspec(dllexport)定义。
-g
产生GNU-GDB调试所需的符号信息
对程序源码进行调试,必须加入这个选项
-Wall
生成所有警告信息
-O
对程序进行优化编译、链接。
采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些,而且对执行文件的调试会产生一定的影响,造成一些执行效果与对应源文件代码不一致等一些令人“困惑”的情况。因此,一般在编译生成软件发行版时使用此选项
-O2
比 -O 更好的优化编译、链接
当然整个编译链接过程会更慢
LDFLAGS
LDFLAGS
-lc
-lm
-lpthread
-lz
-ldl
-lc
-lc 是link libc.so
主要包括C标准库函数和系统函数,几乎所有C程序的运行都依赖于libc.so
-lm
-lm 是link libm
主要包含数学计算的库
-lpthread
主要包含线程相关的库
-lz
-lz 是link libz
一个免费的、通用的、合法的、不受任何专利限制的无损数据压缩库,可用于几乎任何计算机硬件和操作系统
-ldl
Linux 系统 如果你的程序中使用dlopen、dlsym、dlclose、dlerror 显示加载动态库,需要设置链接选项