作为IT工程师,我将分享使用CMake构建Linux智能城市应用程序的专业配置技巧。智能城市应用通常涉及物联网(IoT)、大数据处理和实时分析等复杂功能,合理的CMake配置对项目成功至关重要。
cmake_minimum_required(VERSION 3.12)
推荐使用3.12或更高版本,以获得现代CMake功能支持。
project(SmartCityApp
VERSION 1.0.0
DESCRIPTION "Linux Smart City Application"
LANGUAGES CXX)
明确指定项目版本和描述,便于后续打包和文档生成。
智能城市应用通常包含多个子系统,建议采用模块化结构:
smart-city-app/
├── CMakeLists.txt # 根CMake
├── core/ # 核心模块
│ ├── CMakeLists.txt
│ ├── include/
│ └── src/
├── iot/ # IoT模块
│ ├── CMakeLists.txt
│ ├── include/
│ └── src/
├── analytics/ # 分析模块
│ ├── CMakeLists.txt
│ ├── include/
│ └── src/
└── apps/ # 应用程序
├── CMakeLists.txt
└── main.cpp
根CMakeLists.txt:
add_subdirectory(core)
add_subdirectory(iot)
add_subdirectory(analytics)
add_subdirectory(apps)
模块CMakeLists.txt示例(如iot/):
add_library(iot
src/sensor_interface.cpp
src/device_manager.cpp
include/iot/sensor_interface.h
include/iot/device_manager.h)
target_include_directories(iot
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_link_libraries(iot
PUBLIC
core
some_external_lib)
find_package(PkgConfig REQUIRED)
pkg_check_modules(ZMQ REQUIRED libzmq)
pkg_check_modules(MOSQUITTO REQUIRED libmosquitto)
find_package(Protobuf CONFIG REQUIRED)
find_package(OpenCV 4.2 REQUIRED COMPONENTS core imgproc videoio)
target_link_libraries(analytics
PRIVATE
Protobuf::libprotobuf
OpenCV::core
OpenCV::imgproc)
include(FetchContent)
FetchContent_Declare(
nlohmann_json
GIT_REPOSITORY https://github.com/nlohmann/json.git
GIT_TAG v3.10.5
)
FetchContent_MakeAvailable(nlohmann_json)
target_link_libraries(core PUBLIC nlohmann_json::nlohmann_json)
# MQTT支持
find_package(PahoMqttC REQUIRED)
find_package(PahoMqttCpp REQUIRED)
target_link_libraries(iot
PRIVATE
PahoMqttC::PahoMqttC
PahoMqttCpp::PahoMqttCpp)
# PostgreSQL支持
find_package(PostgreSQL REQUIRED)
target_link_libraries(analytics PRIVATE PostgreSQL::PostgreSQL)
# 时序数据库支持
find_package(InfluxDB REQUIRED)
target_link_libraries(analytics PRIVATE InfluxDB::InfluxDB)
# 线程支持
find_package(Threads REQUIRED)
target_link_libraries(core PUBLIC Threads::Threads)
# 异步任务库
find_package(Boost REQUIRED COMPONENTS thread system)
target_link_libraries(core PUBLIC Boost::thread Boost::system)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(core PRIVATE
-Wall
-Wextra
-Werror
-O3
-march=native)
endif()
add_compile_options(
-D_FORTIFY_SOURCE=2
-fstack-protector-strong
-Wformat
-Wformat-security)
add_link_options(
-Wl,-z,now
-Wl,-z,relro)
enable_testing()
find_package(GTest REQUIRED)
add_subdirectory(tests)
# 在tests/CMakeLists.txt中
add_executable(sensor_tests sensor_test.cpp)
target_link_libraries(sensor_tests
PRIVATE
GTest::GTest
GTest::Main
iot)
add_test(NAME sensor_tests COMMAND sensor_tests)
include(GNUInstallDirs)
install(TARGETS smart_city_app
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY ${CMAKE_SOURCE_DIR}/config/
DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/smartcity)
set(CPACK_GENERATOR "DEB;RPM")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libzmq5, libmosquitto1")
include(CPack)
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
# Linux特有配置
find_package(Systemd REQUIRED)
configure_file(
${CMAKE_SOURCE_DIR}/config/smartcity.service.in
${CMAKE_BINARY_DIR}/smartcity.service)
install(FILES ${CMAKE_BINARY_DIR}/smartcity.service
DESTINATION ${SYSTEMD_UNIT_INSTALL_DIR})
endif()
option(ENABLE_PROFILING "Enable profiling support" OFF)
if(ENABLE_PROFILING)
find_package(gperftools REQUIRED)
target_link_libraries(core PRIVATE gperftools::profiler)
target_compile_definitions(core PRIVATE ENABLE_PROFILING=1)
endif()
# 为嵌入式设备交叉编译
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/toolchains/arm-linux-gnueabihf.cmake)
find_package(spdlog REQUIRED)
target_link_libraries(core PUBLIC spdlog::spdlog)
# 根据构建类型设置日志级别
target_compile_definitions(core
PRIVATE
$<$<CONFIG:Debug>:SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_DEBUG>
$<$<CONFIG:Release>:SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_INFO>)
# 在RelWithDebInfo模式下包含调试符号
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -g")
通过以上CMake配置技巧,您可以构建一个结构良好、高效且可维护的Linux智能城市应用程序。根据项目具体需求,可以进一步调整和扩展这些配置。