gcc g++编译 CMakeLists.txt build.sh

📅 2026/8/13 18:07:57
gcc g++编译  CMakeLists.txt  build.sh
正常记录一下工作中用到的编译指令不是教程。CMakeLists编译以cyclonedds为例example中的helloworld不需要单独编译只需要把dds整体编译中打开example的编译即可apt install cmake# 进入build根目录 cd /home/qinyanmin/dds/code/cyclonedds-master mkdir build cd build # cmake 必须带上开启示例参数 cmake .. -DCMAKE_BUILD_TYPERelease -DBUILD_EXAMPLESON # 全局编译 make -j$(nproc)cmake .. -DCMAKE_BUILD_TYPERelease -DBUILD_EXAMPLESONcmake 是把 CMakeLists跨平台windows、Linux、macos通用的编译规则翻译成对应平台的编译脚本文件。如果需要跨平台CMakeLists必须支持跨平台cmake只是翻译即在Linux里cmake将CMakeLists翻译成Makefile。-DCMAKE_BUILD_TYPERelease-D 定义 CMake 变量Release发布模式 开启编译器优化、去掉调试信息生成运行更快的程序对应还有Debug带 gdb 调试符号开发调试用。-DBUILD_EXAMPLESON开启编译示例代码examples就是要用的 helloworld publisher/subscribermake -j$(nproc)make根据 cmake 生成的 Makefile 执行编译**-j \((nproc)** -j多线程并行编译 \)(nproc)自动读取当前服务器CPU核心数量 等价于make -j8、make -j16充分利用多核大幅加快编译速度CMakeLists.txt环境变量${CMAKE_CURRENT_SOURCE_DIR}#当前CMakeLists.txt路径${CMAKE_INSTALL_PREFIX}#用于指定项目安装路径的前缀目录即执行 make install 或 cmake --install 时文件安装的根路径 #Linux/macOS 默认值为 /usr/local示例# 当变量J6为真时设置交叉编译工具链路径指定为ARM架构aarch64-linux-gnu的GCC和G编译器。 # 必须放在CMakeLists的最顶部 if(J6) set(ENV{LINARO_GCC_ROOT} /usr/bin) set(CMAKE_C_COMPILER $ENV{LINARO_GCC_ROOT}/aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER $ENV{LINARO_GCC_ROOT}/aarch64-linux-gnu-g) endif() cmake_minimum_required(VERSION 3.10) #指定CMake最低版本 project(scom-dltDaemon VERSION 1.0) #项目名称 # 添加源文件 add_executable(Example1 main.c) # 查找.so文件 file(GLOB LIBRARY_FILES libdltUnixClient.so) # 链接到目标 target_link_libraries(Example1 ${LIBRARY_FILES}) # 添加编译选项 target_compile_options(Example1 PRIVATE -Wall -Wextra) # 添加头文件目录如果有的话 target_include_directories(Example1 PRIVATE dltUnixClient.h)【进阶】# 当变量J6为真时设置交叉编译工具链路径指定为ARM架构aarch64-linux-gnu的GCC和G编译器。 # 必须放在CMakeLists的最顶部 if(J6) set(ENV{LINARO_GCC_ROOT} /usr/bin) set(CMAKE_C_COMPILER $ENV{LINARO_GCC_ROOT}/aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER $ENV{LINARO_GCC_ROOT}/aarch64-linux-gnu-g) endif() cmake_minimum_required(VERSION 3.16) #指定CMake最低版本 project(scom-dltDaemon VERSION 1.0) #项目名称 # 添加库文件和目标 add_library(dltUnixClient SHARED dltUnixClient.c ./common/ringbuffer.c) set_target_properties(dltUnixClient PROPERTIES VERSION 1.4.0 SOVERSION 1 ) # 添加源文件 add_executable(DLT_UNIX_CLIENT main.c dltUnixClient.c ./common/ringbuffer.c) # 添加编译选项 # 启用额外警告-Wall -Wextra和优化级别-O3。 target_compile_options(DLT_UNIX_CLIENT PRIVATE -Wall -Wextra -fPIC -O3) # 添加头文件目录如果有的话 target_include_directories(DLT_UNIX_CLIENT PRIVATE ./ ./common) # 增加.so文件软链接 target_link_libraries(DLT_UNIX_CLIENT PRIVATE pthread rt) # 将动态库安装到lib目录头文件安装到include目录 install(TARGETS dltUnixClient DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) install(FILES dltUnixClient.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/dlt)build.sh这里的build.sh作为cicd的编译脚本和上面的CMakeLists.txt相结合使用。./build.sh -h //获取帮助./build.sh -y //yocto编译./build.sh -x //x86编译#!/bin/bash set -e echo Welcome to CICD DLT BUILD!\n\n # 默认参数值 jobs1 yocto_flagfalse help_flagfalse clean_flagfalse x86_flagfalse install_prefixpwd/output shell_pathpwd dlt_home../../scom-dltdaemon dlt_clienthome../../scom-dltdaemon/dltClient/unix # 使用 getopt 处理长参数和短参数 options$(getopt -o j:xyhc -l jobs:,x86,yocto,help -- $) if [ $? ! 0 ]; then echo getopt error exit 1 fi eval set -- $options # 解析命令行参数 while true; do case $1 in -j | --jobs) jobs$2 shift 2 ;; -y | --yocto) yocto_flagtrue shift ;; -x | --x86) x86_flagtrue shift ;; -h | --help) help_flagtrue shift ;; -c) clean_flagtrue shift ;; --) shift break ;; *) echo Invalid option: $1 2 help_flagtrue ;; esac done # ---------- 函数块 --------- show_helps() { echo Usage: $0 [-j jobs] [--yocto] [-h] echo -j, --jobs jobs Number of jobs to run in parallel (default: 1) echo -y, --yocto Enable Yocto build mode echo -h, --help Display this help message echo -x, --x86 Enable x86 build mode echo -c, Clean project } show_parameters() { echo -e \e[32mBuilder parameters:\e[0m echo -- Number of jobs : [$jobs] echo -- Yocto build mode : [$yocto_flag] echo -- x86 build mode : [$x86_flag] if [ $yocto_flag true ]; then install_prefix$install_prefix/yocto echo -- install path : $install_prefix elif [ $x86_flag true ]; then install_prefix$install_prefix/x86 echo -- install path : $install_prefix fi } build_dltserver(){ echo -e \e[32mStart build dltserver project\e[0m cd $dlt_home if [ -d build ]; then cd build rm -rf * else mkdir build cd build fi if [[ $1 ~ ^J6$ ]]; then cmake -DCMAKE_INSTALL_PREFIX$install_prefix -DJ61 .. cmake --build . --target install -j $jobs echo The compilation version is J6. else cmake -DCMAKE_INSTALL_PREFIX$install_prefix .. cmake --build . --target install -j $jobs echo The compilation version is default. fi echo -e \e[32mSuccess build dltserver project\e[0m } build_dltclient() { echo -e \e[32mStart build dltclient project\e[0m cd $dlt_clienthome if [ -d build ]; then cd build rm -rf * else mkdir build cd build fi if [[ $1 ~ ^J6$ ]]; then cmake -DCMAKE_INSTALL_PREFIX$install_prefix -DJ61 .. cmake --build . --target install -j $jobs echo The compilation version is J6. else cmake -DCMAKE_INSTALL_PREFIX$install_prefix .. cmake --build . --target install -j $jobs echo The compilation version is default. fi echo -e \e[32mSuccess build dltclient project\e[0m } clean_project() { cd $shell_path if [ $yocto_flag true ]; then rm -rf output/yocto else rm -rf output/x86 fi } # -------- 逻辑区 ---------- # 显示帮助信息 if [ $help_flag true ]; then show_helps exit 0 fi # 清理编译产物 if [ $clean_flag true ]; then echo -e \e[32mStart clean project\e[0m clean_project echo -e \e[32mSuccess clean project\e[0m exit 1 fi # 编译参数打印 show_parameters clean_project if [ $yocto_flag true ]; then echo -e \e[32mEnabling Yocto build mode\e[0m build_dltserver J6 build_dltclient J6 fi if [ $x86_flag true ]; then echo -e \e[32mEnabling x86 build mode\e[0m build_dltserver build_dltclient figcc 编译指令gcc main.c -o dlt_client -L . -ldltUnixClientg编译指令g main.c -o dlt_client -L . -ldltUnixClientmain.c指定要编译的源文件。-o dlt_client指定输出可执行文件名为dlt_client。-L .告诉链接器在当前目录(.)中搜索库文件。-ldltUnixClient链接名为libdltUnixClient.so或.a的库文件。完整解释该命令会将main.c源文件经过预处理、编译、汇编后与libdltUnixClient库进行链接最终生成名为dlt_client的可执行文件。-L和-l参数通常配合使用前者指定库搜索路径后者指定具体要链接的库名会自动添加lib前缀和.so/.a后缀。如果遇到库文件缺失错误需要确保libdltUnixClient.so.1等库文件确实存在于当前目录或系统库路径中。文件缺失错误-增加环境变量export LD_LIBRARY_PATH${PWD}