作者:朱金灿
来源:clever101的专栏
原来以为Linux makefile挺复杂的,直到从网上找到一个编译模板,发现Linux makefile是如此简单,而且你还可以根据该模板实现C程序和C++程序的混合编译。下面是Linux makefile模板的脚本代码:
# 指定c编译器
CC = gcc
# 指定C++编译器
C++ = g++
# 指定链接器
LINK = g++
# 指定包含头文件路径
INCLUDES = -I. -I"/opt/ThirdPartyLib/pugixml/include" -I"/opt/ThirdPartyLib/libcurl/include" -I"/opt/ThirdPartyLib/hdf4/include" -I"/opt/ThirdPartyLib/hdf-eos2-3.0/include"
# 指定包含的库文件路径及对应的库文件
LIBS = -L"/opt/ThirdPartyLib/pugixml/lib" -lpugixml -lsqlite3 -L"/opt/ThirdPartyLib/libcurl/lib" -lcurl
# 设置c程序编译选项
CCFLAGS = -Wl,--rpath=./:/opt/ThirdPartyLib/libcurl/lib -DHAVE_STRUCT_TIMEVAL -DHAVE_RECV -DHAVE_SEND -DHAVE_STDBOOL_H -DHAVE_BOOL_T -DSTDC_HEADERS -DHAVE_FCNTL_H -DHAVE_FCNTL_O_NONBLOCK -DHAVE_UNISTD_H -DHAVE_SYS_STAT_H -DHAVE_SYS_TYPES_H -c -g -fPIC
# 设置c++程序编译选项
C++FLAGS =-Wl,--rpath=./:/opt/ThirdPartyLib/libcurl/lib -DHAVE_STRUCT_TIMEVAL -DHAVE_RECV -DHAVE_SEND -DHAVE_STDBOOL_H -DHAVE_BOOL_T -DSTDC_HEADERS -DHAVE_FCNTL_H -DHAVE_FCNTL_O_NONBLOCK -DHAVE_UNISTD_H -DHAVE_SYS_STAT_H -DHAVE_SYS_TYPES_H -std=c++11 -c -g -fPIC
# 指定编译输出文件路径
TARGET=/opt/Program/bin/demo
# 指定编译的c++源码文件
C++FILES = DatabaseOperation.cpp DownloadData.cpp
# 指定编译的c源码文件
CFILES = dynbuf.c curl_multibyte.c nonblock.c slist_wc.c strtoofft.c tool_binmode.c \
tool_writeout.c tool_writeout_json.c warnless.c
# 指定目标文件
OBJFILE = $(CFILES:.c=.o) $(C++FILES:.cpp=.o)
all:$(TARGET)
$(TARGET):$(OBJFILE)
$(LINK) $^ $(LIBS) -Wl,--rpath=/opt/MonitoringDroughtProgram/bin:/opt/ThirdPartyLib/pugixml/lib:/opt/ThirdPartyLib/libcurl/lib -fPIE -o $@
%.o:%.c
$(CC) -o $@ $(CCFLAGS) $< $(INCLUDES)
%.o:%.cpp
$(C++) -o $@ $(C++FLAGS) $< $(INCLUDES)
# 安装命令选项
install:
tsxs -i -o $(TARGET)
# 清理中间编译文件选项
clean:
rm -rf $(TARGET)
rm -rf $(OBJFILE)
从上面可以看出一个标准Linux makefile的脉络是相当清晰的,大概可以分为以下几部分:指定编译器(c编译器或者C++编译器),指定的包含的头文件路径以及库文件路径以及对应的库文件、设置c程序编译选项、设置c++程序编译选项、指定编译的c++或c源码文件、指定编译输出文件路径和指定目标文件,其它部分基本照抄就行。
参考文献:
1.Linux下的C/C++ 混合编译