cmake作为C/C++常用代码构建工具是在工作生活中常用的。此文章尽量使用一个通用的结构来帮助初学者构建工程。
代码构建的结构如下
build
include
lib
src
---sqlite3
------sqlite3.c
------sqlite3.h
---SQLiteCppInclude
------Assertion.h
---main.cpp
CMakeLists.txt
说明:build目录主要是将cmake进行创建。include放第三方库的头文件。lib放第三方库的文件包括.so和.a文件。src文件夹放程序中需要用到的头文件和CPP、C文件。
CMakeLists.txt文件内容如下:
cmake_minimum_required(VERSION 3.0.0)
#设置输出文件的目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/build)
#使用C++11的标准进行
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#设置编译的类型是release
if (NOT DEFINED CMAKE_BUILD_TYPE)
set (CMAKE_BUILD_TYPE Release CACHE STRING "Build type")
endif ()
#设置工程名称
project(TrafficLightProject VERSION 0.1.0)
#经过尝试只能放到project的后面
set(CMAKE_CXX_FLAGS "-Wno-psabi -std=c++11 ${CMAKE_CXX_FLAGS}")
message(STATUS "[${CMAKE_CXX_FLAGS}]")
include_directories(./include)
link_directories (./lib)
#添加需要编译的库
set(LINK_LIBS libevent.so
libevent_core.so
libevent_extra.so
libevent_pthreads.so
libmodbus.a
libopen62541.a
libsnap7.so
libspdlog.a
libmuparser.so
libuci.so
)
#设置需要编译的源代码 通过循环的方式将子目录下的文件也加入进去
file(GLOB_RECURSE SRCS CONFIGURE_DEPENDS src/*.c src/*.cpp src/*.h)
add_executable(TrafficLightControl ${SRCS})
target_link_libraries(TrafficLightControl ${LINK_LIBS})
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
进入到build目录之后,使用如下命令对需要交叉编译的或者需要指定编译器的进行指定。
cmake .. -DCMAKE_C_COMPILER=arm-openwrt-linux-gcc -DCMAKE_CXX_COMPILER=arm-openwrt-linux-g++
在不进行任何报错之后。使用命令完成代码的编译。编译完的文件在build目录下
make -j4
VSCode生成编译
如果在VSCode中进行代码的调试生成需要相应的设置tasks.json和launch.json。
其中launch.json如下:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/testcamke.exe", // 步骤1 修改可执行文件路径
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "Build", // 步骤2 配置自动化生成任务
}
]
}
tasks.json文件内容如下:
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build"
},
"tasks": [
{
"label": "cmake",
"type": "shell",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group": {
"kind": "build",
"isDefault": true
},
//"command": "make",//linux 下用make
"command": "mingw32-make.exe",
"args": []
},
{
"label": "Build",
"dependsOrder": "sequence", //按顺序执行任务依赖项
"dependsOn":[
"cmake",
"make"
]
}
]
}