@Linux
首先改代码,用到MFC的地方直接加宏跳过去先,然后一一配比文件名,注意文件名大小写,尤其是stdafx.h这个文件
然后写makefile,把我自己写的模板提交上来,大佬们走过路过看一看指点指点
第一个是生成库文件的
库文件make模板(以mindy为例)
#mindy makefile
#define mindy develop env; eg: include dir, output dir,
link dir;
#指定sdk头文件路径,仅仅定义了宏
#后续建议吧内部路径修正到环境变量
include $(MAPGIS_DEV_SDK)/make.opt
#指定包含第三方库头文件的路径,仅仅定义了宏
MAPGIS_3RD_GDAL_INC := $(MAPGIS_3RD)/gdal/include
MAPGIS_3RD_JSONC_INC := $(MAPGIS_3RD)/json-c/include
………
#获取当前shell路径
CurDir := $(shell pwd)
#指定当前工程下有哪些工程子目录,注意区分大小写
SubDir :=
#指定编译结果目录
LIBPATH:= /home/mindy/bin
#指定编译结果路径
EXECUTABLE := $(LIBPATH)/demo.so
#指定依赖的动态库,假设依赖libbasmath70.so,只需要填写basmath70
LIBS := winapi winafx basmath70 baseproject json-c z
#指定编译器为gcc
CC:= gcc
LDFLAGS:= -Wl,-Bsymbolic -z now
#指定调试信息
MAPGIS_DEBUG := -g
#具体参与编译的编译选项CFLAGS、CXXFLAGS
#头文件包含
CFLAGS:=-I$(WIN_INC) -I$(MAPGIS_INC) -I$(MAPGIS_IN_INC) -I$(WIN_INC_WIN32) -I$(WIN_INC_MSVCR) -I$(MAPGIS_3RD_GDAL_INC) -I$(MAPGIS_3RD_JSONC_INC)
-I$(MAPGIS_3RD_BOOST) -I$(CurDir)
CFLAGS +=-fPIC $(MAPGIS_DEBUG) -DMAPGIS_LINUX
-DMAPGIS_X64 -DSQLITE3
#添加关键字-fsigned-char、-std=c++11
#
-funsigned-char
#-fno-signed-char
#-fsigned-char
#-fno-unsigned-char
#这四个参数是对char类型进行配置,决定将char类型配置成unsigned
char(前两个参数)或 signed char(后两个参数)
CFLAGS += -fsigned-char
#给定C++版本
CXXFLAGS := $(CFLAGS) -std=c++11
#自定义系统常用变量
RM-F := rm -f
RM := rm
#循环查询所有的.c和.cpp文件
SOURCE := $(wildcard *.c) $(wildcard *.cpp) $(foreach
n, $(SubDir), $(wildcard $(CurDir)/$(n)/*.cpp)) $(foreach n, $(SubDir),
$(wildcard $(CurDir)/$(n)/*.c))
#错过的source文件变量
MISSING_SOURCE :=
#对source进行筛选
SOURCE := $(filter-out $(MISSING_SOURCE),$(SOURCE))
#根据.c和.cpp文件的文件名查询对应的.o文件
OBJS := $(patsubst %.c,%.o,$(patsubst
%.cpp,%.o,$(SOURCE)))
#根据.o文件的文件名查询对应的.d文件
DEPS := $(patsubst %.o,%.d,$(OBJS))
#查询未匹配的.d文件
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
#未匹配到的.d文件生成对应的.cpp文件
MISSING_DEPS_SOURCES:=$(wildcard$(patsubst%.d,%.cpp,$(MISSING_DEPS))
$(patsubst %.d,%.cpp,$(MISSING_DEPS)))
CPPFLAGS += -MD
..PHONY : build deps objs clean allclean rebuild
build: $(EXECUTABLE)
deps : $(DEPS)
objs : $(OBJS)
test :
echo
$(SOURCE)
demo.o :
gcc
$(CFLAGS) -MD -c -o $(CurDir)/demo.o $(CurDir)/demo.c
clean :
$(foreach
n, $(OBJS), $(shell $(RM) $(n)))
$(foreach
n, $(DEPS), $(shell $(RM) $(n)))
allclean: clean
$(RM-F)
$(EXECUTABLE)
rebuild: allclean build
prepare:
header:
#cp
basClass70.h $(MAPGIS_INC)
ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS):
$(RM-F)
$(patsubst %.d,%.o,$@)
endif
-include $(DEPS)
#具体生成动态库编译指令
$(EXECUTABLE) : demo.o $(OBJS)
$(CC) -o
$(EXECUTABLE) -fPIC -shared $(OBJS) -L$(LIBPATH) $(addprefix -l,$(LIBS))
$(LDFLAGS)
ld
$(EXECUTABLE) -rpath $(LIBPATH)
woc,CDSN这个功能我喜欢
下面这个是生成可执行文件的
可执行文件make模板(以mindy为例)
#mindy makefile
#define mindy develop env; eg: include dir, output dir,
link dir;
#当前shell命令执行目录
CurDir := $(shell pwd)
#空变量,建议填写为工程子目录为文件夹名称
SubDir :=
#生成的可执行文件所属目录
LIBPATH :=/home/mindy/bin/x64
#生成的可执行文件(main.out)路径
EXECUTABLE := $(LIBPATH)/main.out
#程序依赖的库名
LIBS :=
#编译器
CC:= gcc
LDFLAGS:= -Wl,-Bsymbolic -z now
#MAPGIS_DEBUG指令变量
MAPGIS_DEBUG := -g
#包含文件变量
CFLAGS := -I$(CurDir)
CFLAGS += $(MAPGIS_DEBUG)
CXXFLAGS := $(CFLAGS)
#自定义系统变量
RM-F := rm -f
RM := rm
#循环查询所有的.c和.cpp文件
SOURCE := $(wildcard *.c) $(wildcard *.cpp) $(foreach
n, $(SubDir), $(wildcard $(CurDir)/$(n)/*.cpp)) $(foreach n, $(SubDir),
$(wildcard $(CurDir)/$(n)/*.c))
#指定的不编译的文件
MISSING_SOURCE :=
#筛选之后剩余的.cpp和.c文件
SOURCE := $(filter-out $(MISSING_SOURCE),$(SOURCE))
#根据.c和.cpp文件的文件名查询对应的.o文件
OBJS := $(patsubst %.c,%.o,$(patsubst
%.cpp,%.o,$(SOURCE)))
#根据.o文件的文件名查询对应的.d文件
DEPS := $(patsubst %.o,%.d,$(OBJS))
#查询未匹配的.d文件
MISSING_DEPS := $(filter-out $(wildcard
$(DEPS)),$(DEPS))
#未匹配到的.d文件生成对应的.cpp文件
MISSING_DEPS_SOURCES:=$(wildcard$(patsubst %.d,%.cpp,$(MISSING_DEPS)) $(patsubst
%.d,%.cpp,$(MISSING_DEPS)))
#创建makefile需要变量
CPPFLAGS += -MD
#整合
..PHONY : build
deps objs clean allclean rebuild
#build路径
build: $(EXECUTABLE)
#deps路径
deps : $(DEPS)
#objs路径
objs : $(OBJS)
#SOURCE路径输出
test :
echo
$(SOURCE)
#进行必要的删除
clean :
$(foreach
n, $(OBJS), $(shell $(RM) $(n)))
$(foreach
n, $(DEPS), $(shell $(RM) $(n)))
allclean: clean
$(RM-F)
$(EXECUTABLE)
rebuild: allclean build
header:
#对MISSING_DEPS内容进行判断
ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS):
$(RM-F)
$(patsubst %.d,%.o,$@)
endif
-include $(DEPS)
#最终的编译链接指令
$(EXECUTABLE) : $(OBJS)
$(CC) -o
$(EXECUTABLE) $(OBJS) -L$(LIBPATH) $(addprefix -l,$(LIBS))
$(LDFLAGS)
以上
后续更新在编译过程中遇到的问题,做下记录