CFLAGS += -g #生成debug信息。 CFLAGS += -o #链接,生成可执行文件。 CFLAGS += -Werror #将warning视为错误,停止编译。 CFLAGS += -Wno-error #warning将不会导致编译停止。 CFLAGS += -fPIC #生成位置无关的代码。
. # 内部头文件 INC_CFLAGS += -I $(APP_TEST_DIR)/Inc # 对外接口目录 INC_CFLAGS += -I $(APP_TEST_DIR)/Intf # 动态链接库 Src/*.c C_OBJS += $(patsubst %.c,%.o,$(wildcard $(CSRC))) # 动态库编译标志 DEBUG = y ifeq ($(DEBUG),y) DEBUG_CFLAGS += -DDEBUG DEBUG_CFLAGS += -g endif CFLAGS += -c CFLAGS += -Os CFLAGS += -Wall CFLAGS += -fPIC #CFLAGS += -fvisibility=hidden #隐藏属性 CFLAGS += $(DEBUG_CFLAGS) # 目标文件 Target_Lib=$(APP_TEST_DIR). ) $(INC_CFLAGS) $< -o $@ .PHONY:all clean clean: -rm -f $(C_OBJS) -rm -f $(TARGET) 我一般是当模板用的,没咋研究
QMAKE_CFLAGS_RELEASE = -O2 -MD QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi QMAKE_CFLAGS_DEBUG = -Zi -MDd QMAKE_CFLAGS_YACC = QMAKE_CFLAGS_LTCG = -GL QMAKE_CFLAGS_MP = -MP QMAKE_CFLAGS_SSE2 = -arch:SSE2 QMAKE_CFLAGS_SSE3 = -arch:SSE2 QMAKE_CFLAGS_SSSE3 = -arch:SSE2 QMAKE_CFLAGS_SSE4_1 = -arch:SSE2 QMAKE_CFLAGS_SSE4_2 = -arch:SSE2 QMAKE_CFLAGS_AVX 改为 QMAKE_CFLAGS_RELEASE = -O2 -MT QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi QMAKE_CFLAGS_DEBUG
此处以编译Apache为例说明如何使用参数传递: # tar xzvf httpd-2.0.55.tar.gz # cd httpd-2.0.55 CHOST="i686-pc-linux-gnu" \ CFLAGS 附:常见CPU优化参数 386: CHOST="i386-pc-linux-gnu" CFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer" CXXFLAGS ="-march=i386 -O3 -pipe -fomit-frame-pointer" 486: CHOST="i486-pc-linux-gnu" CFLAGS="-march=i486 -O3 ="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer" Pentium PRO (Intel): CHOST="i686-pc-linux-gnu" CFLAGS CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer" Celeron (Intel): CHOST="i686-pc-linux-gnu" CFLAGS
各级子目录的 Makefile 一、各级子目录的 Makefile: 它最简单,形式如下: EXTRA_CFLAGS := CFLAGS_file.o := obj-y += file.o "EXTRA_CFLAGS", 它给当前目录下的所有文件(不含其下的子目录)设置额外的编译选项, 可以不设置 "CFLAGS_xxx.o", 它给当前目录下的 xxx.c 设置它自己的编译选项 CFLAGS EXTRA_CFLAGS CFLAGS_xxx.o 三者组成 xxx.c 的编译选项 二、顶层目录的 Makefile: 它除了定义 obj-y 来指定根目录下要编进程序去的文件 和 CFLAGS_xxx.o 我们还可以给各个子目录下面的 makefile 里面添加 “EXTRA_CFLAGS” “CFLAGS_xxx.o” 这两个变量 "EXTRA_CFLAGS", 它给当前目录下的所有文件 %.o : %.c $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -Wp,-MD,$(dep_file) -c -o $@ $< C.
如果想让用户使用nm -D *.so命令查看时只看到封装的几个函数,在编写makefile时可以使用CFLAGS += -fvisibility=hidden 标志,再将给用户的函数名称前加上__attribute makefile使用CFLAGS += -fvisibility=hidden标志时,会将所有函数全部隐藏,不使用该标志时,默认所有函数全部公开。 gcc 版本4以上可用【未测试】。 += -DDEBUG DEBUG_CFLAGS += -g endif CFLAGS += -c CFLAGS += -Os CFLAGS += -Wall CFLAGS += -fPIC CFLAGS += -fvisibility=hidden #隐藏属性 CFLAGS += $(DEBUG_CFLAGS) # 目标文件 #Target_Lib=$(APP_STACK_DIR). ) $(INC_CFLAGS) $< -o $@ .PHONY:all clean clean: -rm -f $(C_OBJS) -rm -f $(TARGET) 2.
,比如特定平台的参数: /* #cgo CFLAGS: -DPNG_DEBUG=1 #cgo amd64 386 CFLAGS: -DX86=1 #cgo LDFLAGS: -lpng #include <png.h> */ import "C" CFLAGS 用来给c编译器提供开关,比如指定头文件的位置等。 编译c文件的时候,一般会经过四个步骤: 预处理、编译、汇编和链接,开发参数可以起到如下作用: // 预处理 $(CC) $(CPPFLAGS) $(CFLAGS) -E main.c -o main.i // 编译 $(CC) $(CPPFLAGS) $(CFLAGS) -S main.i -o main.s // 汇编,"-c"选项表示不执行链接步骤 $(CC) $(CPPFLAGS) $(CFLAGS ) -c main.s -o main.o // 也可以将前面的三个步骤合起来(预处理、编译、汇编) $(CC) $(CPPFLAGS) $(CFLAGS) -c main.c -o main.o /
\ -I/usr/include/mysql/ \ -L/usr/lib/mysql # 64位系统编译32位程序 显示警告(Wall) g++ -Wall -g -m32 CFLAGS =-Wall -g -m32 # 目标 TARGET=demo.so OBJ=demo.o # 通用 $(TARGET):$(OBJ) $(CC) $(CFLAGS) -o $(TARGET ) $(OBJ) $(LIB) checklink:$(OBJ) $(CC) $(CFLAGS) -o $@ $^ $(LIB) %.o: %.cpp $(CC) $(CFLAGS) $(LIB) -c -o $@ $< %.o: %.c $(CC) $(CFLAGS) $(LIB) -c -o $@ $< %.o: %.cc $(CC) $(CFLAGS) $(LIB
我们首先看一下: gcc -Wall hello.c `pkg-config fuse3 --cflags --libs` -o hello [root@docker pkgconfig]# cat fuse.pc 其实,pkg-config同其他命令一样,有很多选项,不过我们一般只会用到--libs和--cflags选项。更多的选项可以在这里查看。这样我们就简单了解到了pkg-config 命令是什么了? 比如$gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main就指定了要查找的.pc文件是gtk+-2.0.pc。 又比如,有第三方库OpenCV,而且其对应的pc文件为opencv.pc,那么我们在使用的时候,就要这样写`pkg-config --cflags --libs opencv`。 书写方法 只需写5个内容即可:Name、Description、Version、Cflags、Libs。
Cflags:是下边四个值或者是他们的或(|)运算。 REG_EXTENDED:使用POSIX扩展正则表达式语法解释的正则表达式。如果没有设置,基本POSIX正则表达式语法。 %s\n", ebuff); cflags |= REG_NEWLINE; ret = regcomp(®, reg_str, cflags); if (ret) %s\n", ebuff); cflags |= REG_NEWLINE; ret = regcomp(®, reg_str, cflags); if (ret) %s\n", ebuff); cflags |= REG_NEWLINE; ret = regcomp(®, reg_str, cflags); if (ret) %s\n", ebuff); cflags |= REG_NEWLINE; ret = regcomp(®, reg_str, cflags); if (ret)
这儿是一个编译时使用pkg-config的样例: gcc -o test test.c $(pkg-config --libs --cflags libpng) pkg-config 同其他命令一样,有很多选项 ,不过我们一般只会用到 --libs 和 --cflags 选项,分别用于搜索指定头文件和库文件。 DEPENDENCIES=libcpg libcmap libquorum libqb glib-2.0 fuse sqlite3 librrd CFLAGS += -I. CFLAGS += $(shell pkg-config --cflags ${DEPENDENCIES}) LDFLAGS += $(shell pkg-config --libs ${DEPENDENCIES }) .c.o: $(CC) $(CFLAGS) -c -o $@ $< -MMD -MT $@ -MF $@.d ...
= -g -Wall -ansi #options for release #CFLAGS = -0 -Wall -ansi myapp: main.o 2.o 3.o $(CC) -o myapp main.o 2.o 3.o main.o: main.c a.h $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c 2.o: 2.c a.h b.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c 3.o: 3.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c = -g -Wall -ansi #options for release #CFLAGS = -0 -Wall -ansi myapp: main.o 2.o 3.o $(CC) -o $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c 3.o: 3.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c clean
="-marm" # build_one #arm v6 #CPU=armv6 #OPTIMIZE_CFLAGS="-marm -march=$CPU" #PREFIX=. /android/$CPU #ADDITIONAL_CONFIGURE_FLAG= #build_one #arm v7vfpv3 # CPU=armv7-a # OPTIMIZE_CFLAGS=" android/$CPU #ADDITIONAL_CONFIGURE_FLAG=--enable-neon #build_one #arm v6+vfp #CPU=armv6 #OPTIMIZE_CFLAGS ="-marm" # build_one #arm v6 #CPU=armv6 #OPTIMIZE_CFLAGS="-marm -march=$CPU" #PREFIX=. /android/$CPU #ADDITIONAL_CONFIGURE_FLAG= #build_one #arm v7vfpv3 # CPU=armv7-a # OPTIMIZE_CFLAGS="
makefile这样写: ifdef DEBUG CFLAGS += -DDEBUG=1 -O0 -ggdb RELMODE = debug else CFLAGS += -DDEBUG=0 - 用make 变量ver, 控制CFLAGS 变量,从而编译出不同版本。 = -g -Ddebug else $(warning ver is not debug) CFLAGS = -c -O3 endif $(TARGET): $(OBJS) 另外一个办法是通过makefile修改,比如: CFLAGS=-g -Wall -DDEBUG object=myprog all:$objectmyprog:a.c gcc ${CFLAGS} a.c -o ${object} 如果更进一步,连makefile都不想修改,我们可以通过向make命令传递参数来进行,为此,我们需要适当的修改makefile如下: CFLAGS=CFLAG CFLAGS+
emscripten sdl2-config called with /emsdk_portable/emscripten/tag-1.38.45/system/bin/sdl2-config --cflags ="$CFLAGS" --extra-cxxflags="$CFLAGS" --extra-ldflags="$LDFLAGS" --nm="llvm-nm" --ar=emar - ="$CFLAGS" --extra-cxxflags="$CFLAGS" --extra-ldflags="$LDFLAGS" --nm="llvm-nm" --ar=emar - ="$CFLAGS" --extra-cxxflags="$CFLAGS" --extra-ldflags="$LDFLAGS" --nm="llvm-nm" --ar=emar - ="$CFLAGS" --extra-cxxflags="$CFLAGS" --extra-ldflags="$LDFLAGS" --nm="llvm-nm" --ar=emar -
="-march=armv5te" ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" #-mfloat-abi=hard -mfpu=vfpv3-d16 #-mfloat-abi=hard -mfpu=vfp ANDROID_ARMV8_CFLAGS="-march=armv8-a" ANDROID_X86_CFLAGS ="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32" ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 - mpopcnt -m64 -mtune=intel" # params($1:arch,$2:arch_abi,$3:host,$4:cross_prefix,$5:cflags) build_bin x86_64 x86_64 x86_64 x86_64-linux-android "$ANDROID_X86_64_CFLAGS" 3 chmod 777 build_android.sh 4
是-c的选项,LDFLAGS是链接的选项 FINAL_CFLAGS=$(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS) $(REDIS_CFLAGS) FINAL_LDFLAGS += -DUSE_TCMALLOC FINAL_LIBS+= -ltcmalloc endif ifeq ($(MALLOC),tcmalloc_minimal) FINAL_CFLAGS+= - =$(CFLAGS) >> .make-settings echo LDFLAGS=$(LDFLAGS) >> .make-settings echo REDIS_CFLAGS=$(REDIS_CFLAGS ) >> .make-settings echo REDIS_LDFLAGS=$(REDIS_LDFLAGS) >> .make-settings echo PREV_FINAL_CFLAGS=$( FINAL_CFLAGS) >> .make-settings echo PREV_FINAL_LDFLAGS=$(FINAL_LDFLAGS) >> .make-settings -(cd ..
Android.mk LOCAL_PATH:=$(call my-dir) # iwlib include $(CLEAR_VARS) LOCAL_SRC_FILES := iwlib.c LOCAL_CFLAGS include $(BUILD_STATIC_LIBRARY) # iwconfig include $(CLEAR_VARS) LOCAL_SRC_FILES := iwconfig.c LOCAL_CFLAGS include $(BUILD_EXECUTABLE) # iwevent include $(CLEAR_VARS) LOCAL_SRC_FILES := iwevent.c LOCAL_CFLAGS include $(BUILD_EXECUTABLE) # iwgetid include $(CLEAR_VARS) LOCAL_SRC_FILES := iwgetid.c LOCAL_CFLAGS optional include $(BUILD_EXECUTABLE) # iwspy include $(CLEAR_VARS) LOCAL_SRC_FILES := iwspy.c LOCAL_CFLAGS
= -Wall -O -g firstTest:$(OBJS) $(G) $(OBJS) -o firstTest test1.o:test1.cpp test2.h $(G) $(CFLAGS) - CFLAGS = -Wall -O -g 配置编译器设置,并把它赋值给CFLAGS变量 -Wall:输出所有警告信息 -O:在编译时进行优化 -g:表示编译debug版本 这样写的Makefile比较简单 (3)使用函数 C = gcc G = g++ CFLAGS = -Wall -O -g TARGET = . /firstTest %.o:%.c $(C) $(CFLAGS) -c $< -o $@ %.o:%.cpp $(G) $(CFLAGS) -c $< -o $@ SOURCES = $(wildcard <3> %.o:%.c $(C) $(CFLAGS) -c $< -o $@ %.o:%.cpp $(G) $(CFLAGS) -c $< -o $@ 表示把所有的.c、.cpp文件编译成.o文件。
Makefile 示例 # Makefile 示例 # 编译器 CC = gcc # 编译选项 CFLAGS = -Wall -g # 目标文件 TARGET = myprogram # 源文件 CFLAGS: 编译选项的变量,这里设置了 -Wall(显示所有警告)和 -g(生成调试信息)。 TARGET: 目标文件的变量,这里定义了最终生成的可执行文件的名字。 $@ $^ $(CFLAGS) 在这个例子中,CC 和 CFLAGS 都是变量,分别存储了编译器和编译选项。 include common.mk main: main.o utils.o $(CC) -o $@ $^ $(CFLAGS) 10. # 条件语句 ifeq ($(DEBUG),1) CFLAGS += -g else CFLAGS += -O2 endif 21.