通控编译环境搭建
特别注意:使用cmake编译项目,可以不需要配置Tasks任务。远程虚拟机需要安装cmake。
vscode:c/c++、 cmake、 cmake tools
::: tips 用户tct不在sudoers中,此事将被报告 进入root模式,cd /etc vi sudoers 找到root ALL=(ALL) ALL文件,在下方添加自己的账户并:wq!进行强制保存退出, tct ALL=(ALL) ALL :::
# 环境准备
# 升级gcc
yum install centos-release-scl
yum install devtoolset-8
scl enable devtoolset-8 bash
echo "scl enable devtoolset-8 bash" >> ~/.bash_profile
# 安装openssl
sudo yum install openssl-devel
# 安装libuuid:
sudo yum install libuuid-devel
# 安装zlib:
sudo yum install zlib-devel
# 环境安装CMake
tar zxvf CMake.tar.gz # git clone https://github.com/Kitware/CMake
cd CMake && rm CMakeCache.txt #如果有CMakeCache.txt需要删掉
./bootstrap
sudo make && sudo make install
# linux环境编译
在Linux平台下编译,需要编译安装依赖库。
# 客户端安装的库
# iniparser
wget https://codeload.github.com/ndevilla/iniparser/tar.gz/refs/tags/v4.1 -O iniparserv4.1.tar.gz
tar -zxvf iniparserv4.1.tar.gz
cd iniparser-4.1
sudo make && sudo make install
# log4cplus 2.0.6
tar zxvf log4cplus-2.0.6.tar.gz
cd log4cplus-2.0.6
./configure --enable-static CXXFLAGS="-std=c++0x"
sudo make && sudo make install
# jsoncpp
mkdir build
cd build
cmake ..
make && make install
# curl
tar -zxvf curl-7.75.0.tar.gz
cd curl-7.75.0
./configure
sudo make && sudo make install
# 服务器端需要安装额外安装的库
# drogon 1.6.0
cd $WORK_PATH
git clone https://github.com/an-tao/drogon
git checkout v1.6.0 # 根据tag切换到指定版本
cd drogon
git submodule update --init
mkdir build
cd build
cmake ..
sudo make && sudo make install
# libssh2
wget http://www.libssh2.org/download/libssh2-1.4.3.tar.gz
tar -zxvf libssh2-1.4.3.tar.gz
cd libssh2-1.4.3
./configure
sudo make && sudo make install
# 配置编译
如果在编译环境中没有找到所需的gcc版本,需要配置。 在vscode中设置open the Command Palette (Ctrl+Shift+P) and run the CMake: Edit User-Local CMake Kits comman。
,
{
"name": "GCC 8.3.1 x86_64-redhat-linux",
"compilers": {
"C": "/opt/rh/devtoolset-8/root/usr/bin/gcc",
"CXX": "/opt/rh/devtoolset-8/root/usr/bin/g++" # 记得要加上CXX,否则编译会出错
}
}
# 交叉编译
交叉编译,通过引用expend_new,不需要自己安装编译库。
# 安装编译工具链
tar -zxvf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz -C /home/wjl/dev-lib/cross-tools #(-C change改变目录,原文件名称还在)
sudo vi /etc/profile #添加如下配置
export PATH=/home/wjl/dev-lib/cross_tools/bin:$PATH
source /etc/profile # 执行source /etc/profile使其立即生效。
# 配置交叉编译
vi /home/tct/.local/share/CMakeTools/cmake-tools-kits.json 加入如下内容
,
{
"name":"arm-cross-complier",
"toolchainFile":"/home/tct/workspace/tongkong/cross-tools/toolchain.cmake"
} # 记得在前面加逗号,
也可在vscode中设置open the Command Palette (Ctrl+Shift+P) and run the CMake: Edit User-Local CMake Kits comman。加入上述内容。
toolchain.cmake的内容
### toolchain.cmake ###
# this is required
SET(CMAKE_SYSTEM_NAME arm)
# specify the cross compiler
SET(CMAKE_C_COMPILER /home/tct/workspace/tongkong/cross-tools/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /home/tct/workspace/tongkong/cross-tools/bin/arm-linux-gnueabihf-g++)
# 其他依赖安装
# boost
https://www.pianshen.com/article/8462938611/
wget https://boostorg.jfrog.io/artifactory/main/release/1.79.0/source/boost_1_79_0.tar.gz
tar zxvf boost_1_79_0.tar.gz
cd boost_1_79_0
./bootstrap.sh
/b2 --without-python stage debug
$sudo cp -rf boost /usr/include
$sudo cp -rf stage/lib/* /usr/lib64 # 库目录默认存放在stage目录下
# CMakeLists.txt
从 link_directories 的文档:此命令仅适用于在调用后创建的目标。 对于make link_directories()调用工作,您需要在add_executable之前)
# 客户端
cmake_minimum_required(VERSION 3.0.0)
project(CommunicationControlProject VERSION 0.1.0)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
message(${CMAKE_CXX_COMPILER})
# GLOB_RECURSE命令不仅可以遍历当前路径,还可以遍历路径下面的所有子目录
file(GLOB_RECURSE EXTRA_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE EXTRA_C_FILES ${PROJECT_SOURCE_DIR}/src/*.c)
if (NOT CMAKE_CROSSCOMPILING)
SET(INCLUDE_DIR "/usr/local/include")
SET(LINK_DIR "/usr/local/lib")
message(STATUS "linux gcc ===============")
else ()
SET(INCLUDE_DIR "${PROJECT_SOURCE_DIR}/DependLibs/backup/arm")
SET(LINK_DIR "${PROJECT_SOURCE_DIR}/DependLibs/backup/arm-lib")
message(STATUS "jiaochabianyi ===============")
endif ()
LINK_DIRECTORIES(${LINK_DIR}) #指定要链接的库文件的路径
add_executable(CommunicationControlProject ${PROJECT_SOURCE_DIR}/src/entry.cpp ${EXTRA_FILES} ${EXTRA_C_FILES})
############# 代码目录 #################
SET(SRC_INC ${PROJECT_SOURCE_DIR}/src)
target_include_directories(${PROJECT_NAME} PUBLIC ${SRC_INC}
${SRC_INC}/CommonModel
${SRC_INC}/CommunicationModel
${SRC_INC}/DataModel
${SRC_INC}/DispatchManager
${SRC_INC}/FSModel
${SRC_INC}/IniModel
${SRC_INC}/JsonModel
${SRC_INC}/RecordModel
${SRC_INC}/StateMonitoringModel)
if (NOT CMAKE_CROSSCOMPILING)
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/DependLibs/backup/arm/CanFD/include)
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIR}/Ini
${INCLUDE_DIR}/json
${INCLUDE_DIR}/curl
${INCLUDE_DIR}/log4cplus
${INCLUDE_DIR}/DependLibs/backup/arm/mesh/include)
target_link_libraries(${PROJECT_NAME} log4cplus pthread jsoncpp curl iniparser)
else ()
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIR}/CanFD/include
${INCLUDE_DIR}/Ini/include
${INCLUDE_DIR}/Json/include
${INCLUDE_DIR}/libcurl/include/curl
${INCLUDE_DIR}/Log/include
${INCLUDE_DIR}/Log/include/log4cplus
${INCLUDE_DIR}/mesh/include)
target_link_libraries(${PROJECT_NAME} z crypto ssl ssh2 curl pthread jsoncpp log4cplus iniparser)
endif ()
# 服务端
cmake_minimum_required(VERSION 3.5)
project(webservice CXX)
if (NOT CMAKE_CROSSCOMPILING)
set(BUILD_PROGRAMS ON)
include_directories("/usr/local")
include_directories("/usr/local/include/")
LINK_DIRECTORIES("/usr/local/lib/")
message(STATUS "================== linux gcc ==================")
SET(CMAKE_FIND_ROOT_PATH /usr)
else ()
set(BUILD_PROGRAMS OFF)
include_directories("/home/tct/workspace/tongkong/expend_new/include/")
#TODO:添加动态链接库路径
LINK_DIRECTORIES("/home/tct/workspace/tongkong/expend_new/lib")
message(STATUS "================ jiaochabianyi ===============")
SET(CMAKE_FIND_ROOT_PATH "/home/tct/workspace/tongkong/expend_new")
endif ()
include(CheckIncludeFileCXX)
check_include_file_cxx(any HAS_ANY)
check_include_file_cxx(string_view HAS_STRING_VIEW)
check_include_file_cxx(coroutine HAS_COROUTINE)
if (HAS_ANY AND HAS_STRING_VIEW AND HAS_COROUTINE)
set(CMAKE_CXX_STANDARD 20)
elseif (HAS_ANY AND HAS_STRING_VIEW)
set(CMAKE_CXX_STANDARD 17)
else ()
set(CMAKE_CXX_STANDARD 14)
endif ()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall")
add_executable(${PROJECT_NAME} main.cc)
if(NOT CMAKE_CROSSCOMPILING)
find_package(Drogon CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon)
else ()
SET(DROGON_ROOT /home/tct/workspace/tongkong/expend_new/)
SET(DROGON_DIR /home/tct/workspace/tongkong/expend_new/)
SET(BOOST_ROOT /home/tct/workspace/tongkong/expend_new/)
SET(JSONCPP_LIBRARIES /home/tct/workspace/tongkong/expend_new/lib/libjsoncpp.so.24)
SET(JSONCPP_INCLUDE_DIRS /home/tct/workspace/tongkong/expend_new/include/JSONCPP/)
SET(OPENSSL_ROOT_DIR /home/tct/workspace/tongkong/expend_new/)
SET(ZLIB_LIBRARY /home/tct/workspace/tongkong/expend_new/lib/libz.so)
SET(ZLIB_INCLUDE_DIR /home/tct/workspace/tongkong/expend_new/)
find_package(Trantor
PATHS /home/tct/workspace/tongkong/expend_new/
REQUIRED)
find_package(Drogon
PATHS /home/tct/workspace/tongkong/expend_new/
REQUIRED)
endif ()
target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon)
target_link_libraries(${PROJECT_NAME} PRIVATE log4cplus)
target_link_libraries(${PROJECT_NAME} PRIVATE crypto)
target_link_libraries(${PROJECT_NAME} PRIVATE curl)
target_link_libraries(${PROJECT_NAME} PRIVATE ssh2)
if (CMAKE_CXX_STANDARD LESS 17)
# With C++14, use boost to support any and string_view
message(STATUS "use c++14")
find_package(Boost 1.61.0 REQUIRED)
target_include_directories(${PROJECT_NAME} PRIVATE ${Boost_INCLUDE_DIRS})
elseif (CMAKE_CXX_STANDARD LESS 20)
message(STATUS "use c++17")
else ()
message(STATUS "use c++20")
endif ()
aux_source_directory(controllers CTL_SRC)
aux_source_directory(filters FILTER_SRC)
aux_source_directory(plugins PLUGIN_SRC)
aux_source_directory(models MODEL_SRC)
aux_source_directory(src COMMON_SRC)
drogon_create_views(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/views
${CMAKE_CURRENT_BINARY_DIR})
target_include_directories(${PROJECT_NAME}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/models
${CMAKE_CURRENT_SOURCE_DIR}/include)
target_sources(${PROJECT_NAME}
PRIVATE
${SRC_DIR}
${CTL_SRC}
${FILTER_SRC}
${PLUGIN_SRC}
${MODEL_SRC}
${COMMON_SRC})
# update
cmake_minimum_required(VERSION 3.0.0)
project(update VERSION 0.1.0)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
# GLOB_RECURSE命令不仅可以遍历当前路径,还可以遍历路径下面的所有子目录
file(GLOB_RECURSE EXTRA_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp)
add_executable(update ${PROJECT_SOURCE_DIR}/src/update.cpp ${EXTRA_FILES})
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/src
${PROJECT_SOURCE_DIR}/src/CShutDownMain)
通过vscode底端,切换编译环境; 通过build编译程序。
::: tips 写的很好的编译脚本 :::
#!/bin/bash
set -e
PROJ_ROOT=$PWD
BUILD_ROOT=$PROJ_ROOT
echo -e "\033[31m Current Build Root: $BUILD_ROOT \033[0m" # -e激活转义字符
BIN_PATH=$BUILD_ROOT/bin
if [ -d $BIN_PATH ];then
cd $BIN_PATH
rm -rf *
cd ..
else
mkdir -p $BIN_PATH
fi
INC_PATH=$BUILD_ROOT/inc
if [ -d $INC_PATH ];then
cd $INC_PATH
rm -rf *
cd ..
else
mkdir -p $INC_PATH
fi
#cp without path
#find ./src/ -name "*.h" |xargs -i cp {} ./inc/
DEST_PATH="./inc/"
headers=`find . -name *.h`
#echo $headers
for file in $headers
do
#echo $file
temp=${file#*/}
temp=${temp#*/}
dstfile=$DEST_PATH$temp
dstpath=${dstfile%/*}
#echo $dstpath
[ -d $dstpath ] || mkdir -p $dstpath
cp -R $file $dstfile
done
LIB_PATH=$BUILD_ROOT/lib
if [ -d $LIB_PATH ];then
cd $LIB_PATH
rm -rf *
cd ..
else
mkdir -p $LIB_PATH
fi
BUILD_PATH=$BUILD_ROOT/build
if [ -d $BUILD_PATH ];then
cd $BUILD_PATH
rm -rf *
else
mkdir -p $BUILD_PATH
cd $BUILD_PATH
fi
cmake $PROJ_ROOT
make -j4