在开发TCP Server和TCP Client通信功能的项目中,因为ARM板上面跑Client,需要交叉编译。而Ubuntu上面跑Server,需要本地编译。并且Server和Client需要进行条件编译。所以使用Makefile做区分,这样就不用总是修改项目代码了。提高了工作效率。
Makefile
# local build: 0 cross build: 1
LOCAL_BUILD := 0
CROSS_BUILD := 1
BUILD_TYPE := $(LOCAL_BUILD) ###编译前选择交叉编译还是本地编译
ifeq ($(BUILD_TYPE), $(LOCAL_BUILD))
export CC = $(CROSS)gcc
export CXX = $(CROSS)g++
export LD = $(CROSS)ld
endif
export CCFLAGS = -Werror -g -std=gnu++14 -MMD -fasynchronous-unwind-tables -fPIC -pedantic
ifeq ($(BUILD_TYPE), $(CROSS_BUILD))
CCFLAGS += -D CROSS_BUILD ###如果是交叉编译,向源文件添加交叉编译宏定义
endif
在编译源文件的时候就可以进行条件编译。
实验效果:
也可以使用脚本进行条件编译,不需要每次改动脚本。
build.sh
#!/bin/bash
#
MY_SCRIPT_VERSION="0.1.0"
MAKE_COMMAND="make"
MAKE_COMMAND_PARAM="VERBOSE=1"
#####################################################################################################################################################
# set default values (can be configured from command line)
#####################################################################################################################################################
function echo_build(){
echo "#################################"
echo "# Build Project Ethernet Router #"
echo "#################################"
echo ""
}
function echo_clean(){
echo "#################################"
echo "# Clean Project Ethernet Router #"
echo "#################################"
echo ""
}
if [ "-b" == $1 ]
then
echo_build
##source #####
make BUILD_TYPE=1
fi
if [ "-l" == $1 ]
then
echo_build
make BUILD_TYPE=0
fi
if [ "-c" == $1 ]
then
echo_clean
make clean
fi
Makefile
## FLAGS used for compiling ###
# local build: 0 cross build: 1
export LOCAL_BUILD=0
export CROSS_BUILD=1
export BUILD_TYPE
ETH_SERVER_NAME = ethServer
ETH_CLIENT_NAME = ethClient
ifeq ($(BUILD_TYPE), $(LOCAL_BUILD))
export CC = $(CROSS)gcc
export CXX = $(CROSS)g++
export LD = $(CROSS)ld
ETH_SERVER_NAME = ethServerLocal
endif
export CCFLAGS = -Werror -g -std=gnu++14 -MMD -fasynchronous-unwind-tables -fPIC -pedantic
ifeq ($(BUILD_TYPE), $(CROSS_BUILD))
CCFLAGS += -D CROSS_BUILD
endif
##Local Build
./build.sh -l
##Cross Build
./build.sh -b
##Clean Build
./build.sh -c