在最近的项目中,要求把录制程序移植到嵌入式板卡上,原来的vlc模块无法被支持(板卡上无法安装vlc程序以及相应的库),因此要求编译一个去掉vlc模块的版本。折腾半天弄出来了,由于对makefile不熟,很多地方实现的不够理想,仅仅是能用而已。
下面是步骤:
(1)首先编译源代码
在代码中增加编译开关(宏定义):MODULE_WITHOUT_VLC
在源代码中所有涉及到vlc模块的 代码处使用该宏定义重写,确保如果定义了MODULE_WITHOUT_VLC,代码也能正常运行(只是不支持vlc模块而已)
注意:宏MODULE_WITHOUT_VLC并不需要在源代码中定义,下面会做说明
(2)编辑Makefile
由于去掉了vlc模块,所有使用到vlc模块的源文件都不需要编译, 我们将所有待编译的目标文件存放到变量$(ALL_OBJFILE)中,这样的话我们需要从中剔除不需要编译的目标文件:
OBJ_COMP_NOVLC = $(filter-out $(OBJ_VLC), $(ALL_OBJFILE))
这样, $(OBJ_COMP_NOVLC)中存放的就是去除vlc模块的所有需要编译的目标文件
同时,在连接时去我们也需要去除vlc模块。
由于在代码中需要条件编译开关,我把它放在Makefile中作为g++的参数传进来:
$(CXX) --verbose -DMODULE_WITHOUT_VLC -c -o $@ $< $(INCPATHS) -g -Wall -rdynamic
最后我们的Makefile如下:
1 ##################################################################################
2 #
3 #编译Record工程
4 #
5 ##################################################################################
6 #编译选项
7 CXX = g++
8 OPTI = -o3
9 CXXFLAGS = -Wall -Wno-strict-aliasing -Wno-unused-variable
10
11 LIBPATH = /usr/local/lib
12 LIBS = -lpthread -lhcnetsdk -llog4cpp
13 EXE = Record
14 EXE_novlc = Record.novlc
15 DIST_PATH = http://www.cnblogs.com/Record/
16
17 #mysql模块
18 LIB_MYSQL = -rdynamic -L/usr/lib/mysql -lmysqlclient_r -lz -lcrypt -lnsl -lm -lpthread
19 LIBS += $(LIB_MYSQL)
20
21 #日志模块
22
23 #包含头文件路径
24 SUBDIR = $(shell ls http://www.cnblogs.com/src -R | grep /)
25 SUBDIRS = $(subst :,/,$(SUBDIR))
26 INCPATHS = $(subst http://www.cnblogs.com/,-Ihttp://www.cnblogs.com/,$(SUBDIRS))
27 INCPATHS += -I http://www.cnblogs.com/include/
28
29 VPATH = $(subst : ,:,$(SUBDIR))./
30 SOURCE = $(foreach dir,$(SUBDIRS),$(wildcard $(dir)*.cpp))
31
32 #使用vlc模块的目标文件
33 OBJ_VLC = CInputVideoVLC.o COutputVideoVLC.o
34 LIB_VLC = -lvlc
35
36 #根据cpp文件名生成对应的目标文件名.o
37 OBJS = $(patsubst %.cpp,%.o,$(SOURCE))
38 #所有待编译的目标文件
39 ALL_OBJFILE = $(foreach dir,$(OBJS),$(notdir $(dir)))
40 OBJSPATH = $(addprefix obj/,$(OBJFILE))
41 ALL_LIBS = $(LIBS)
42 ALL_LIBS += $(LIB_VLC)
43
44 #without vlc support
45 #最终编译时使用的目标文件
46 OBJ_COMP_NOVLC = $(filter-out $(OBJ_VLC), $(ALL_OBJFILE))
47 LIBS_COMP_NOVLC = $(LIBS)
48
49 $(EXE):$(ALL_OBJFILE)
50 $(CXX) -L$(LIBPATH) -Wl,-rpath=/usr/local/lib/ -o $(EXE) $(ALL_OBJFILE) $(INCPATHS) $(ALL_LIBS)
51 mv $(EXE) $(DIST_PATH)
52
53 $(ALL_OBJFILE):%.o:%.cpp
54 $(CXX) --verb