个人知识库 个人知识库
首页
关于
  • C语言
  • CPlusPlus
  • Linux
  • PHP
  • Nginx
  • MySQL
  • Redis
  • Docker
  • Kubernetes
  • SRS
阅读
常用工具
  • 分类
  • 标签
  • 归档
GitHub

Agnes001

坚持是一件很伟大的事业
首页
关于
  • C语言
  • CPlusPlus
  • Linux
  • PHP
  • Nginx
  • MySQL
  • Redis
  • Docker
  • Kubernetes
  • SRS
阅读
常用工具
  • 分类
  • 标签
  • 归档
GitHub
  • Nginx

  • Qt

  • centos

    • 通控编译
      • 环境准备
        • 升级gcc
        • 安装openssl
        • 安装libuuid:
        • 安装zlib:
      • 环境安装CMake
      • linux环境编译
        • 客户端安装的库
        • 服务器端需要安装额外安装的库
        • 配置编译
      • 交叉编译
        • 安装编译工具链
        • 配置交叉编译
      • 其他依赖安装
        • boost
      • CMakeLists.txt
        • 客户端
        • 服务端
        • update
    • 研祥工控机重装系统
    • linux部署图像识别
    • 查看系统资源
  • MySQL

  • Redis

  • Docker

  • Kubernets

  • SRS

  • 应用框架
  • centos
Agnes001
2022-06-22

通控编译环境搭建

特别注意:使用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
编辑此页
Qt开发简介
研祥工控机重装系统

← Qt开发简介 研祥工控机重装系统 →

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式