CMake

CMake是什么

  • Cross Platform Make,一款优秀的工程构建工具

CMake与其他编译工具的对比

  • autotools,配置繁琐(autoscan+autoconf+automake)
  • CMake,效率比autotools块40%
  • GCC --> Makefile --> CMake(autotools)

示例程序

sample1

  • 程序结构
include
  |__base.h
lib
  |__libbase.a
  |__libbase.so
src
  |__CMakeLists.txt
  |__main
    |__CMakeLists.txt
    |__main.cpp
  |__base
    |__CMakeLists.txt
    |__base.cpp
  • src/CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.8.0)

# 项目名称
project( demo )

# 项目版本
set (demo_VERSION_MAJOR 1)
set (demo_VERSION_MINOR 0)

# 打印信息
MESSAGE(STATUS "PROJECT BINARY DIR: " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "PROJECT SOURCE DIR: " ${PROJECT_SOURCE_DIR})

# 设置配置(Debug/Release)
set(CMAKE_BUILD_TYPE "Debug")

# 设置C++版本
set(CMAKE_CXX_STANDARD 14)
# 或
add_compile_options(-std=c++11)

# 设置编译参数
ADD_DEFINITIONS(-DLINUX)
SET(CMAKE_C_FILAGS "$ENV{CFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_C_FLAGS_RELEASE "$ENV{CFLAGS} -O3 -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

add_subdirectories( base )
add_subdirectories( main )
  • src/base/CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.8.0)

# 项目名称
project( base )

# 项目版本
set (base_VERSION_MAJOR 1)
set (base_VERSION_MINOR 0)

# 打印信息
MESSAGE(STATUS "BINARY DIR: " ${CMAKE_BINARY_DIR})
MESSAGE(STATUS "SOURCE DIR: " ${CMAKE_SOURCE_DIR})
MESSAGE(STATUS "CURRENT BINARY DIR: " ${CMAKE_CURRENT_BINARY_DIR})
MESSAGE(STATUS "CURRENT SOURCE DIR: " ${CMAKE_CURRENT_SOURCE_DIR})

# 自动查找当前目录下的所有源文件, 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 或
# 手动配置源文件, 并将名称保存到 DIR_SRCS 变量
set( DIR_SRCS
  ${CMAKE_CURRENT_SOURCE_DIR}/base.cpp
  ...
)

# 手动配置头文件目录
include_directories(
  ${CMAKE_SOURCE_DIR}/include
)

# 设置库文件输出目录
set(LIBRARY_OUTPUT_PATH $(PROJECT_SOURCE_DIR)/lib)

add_library( base STATIC # STATIC/SHARED/MODULE
  ${DIR_SRCS}
)

# 安装
set(CMAKE_INSTALL_PREFIX /usr)
install(FILES include/base.h DESTINATION include)
install(TARGETS base ARCHIVE DESTINATION lib)
  • src/main/CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.8.0)

# 项目名称
project( main )

# 项目版本
set (main_VERSION_MAJOR 1)
set (main_VERSION_MINOR 0)

# 打印信息
MESSAGE(STATUS "BINARY DIR: " ${CMAKE_BINARY_DIR})
MESSAGE(STATUS "SOURCE DIR: " ${CMAKE_SOURCE_DIR})
MESSAGE(STATUS "CURRENT BINARY DIR: " ${CMAKE_CURRENT_BINARY_DIR})
MESSAGE(STATUS "CURRENT SOURCE DIR: " ${CMAKE_CURRENT_SOURCE_DIR})

# 检查系统是否支持 pow 函数
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)

# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )

# 是否加入 Math 库
if (NOT HAVE_POW)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)
  set (EXTRA_LIBS ${EXTRA_LIBS} math)
endif (NOT HAVE_POW)

# 自动查找当前目录下的所有源文件, 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 或
# 手动配置源文件, 并将名称保存到 DIR_SRCS 变量
set( DIR_SRCS
  ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
  ...
)

# 手动配置头文件目录
include_directories(
  ${CMAKE_SOURCE_DIR}/include
)

# 手动配置库文件目录
link_directories(
  ${CMAKE_SOURCE_DIR}/lib
)

add_excutable( main
  ${DIR_SRCS}
)

target_link_libraries(
  main
  "base" # 双引号表示从库路径中查找libhello.a
)

# 构建一个 CPack 安装包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
  "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${main_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${main_VERSION_MINOR}")
include (CPack)

# 启用测试
enable_testing()

# 测试程序是否成功运行
add_test (test_run main 5 2)

# 测试帮助信息是否可以正常提示
add_test (test_usage main)
set_tests_properties (test_usage
  PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")

# 定义一个宏,用来简化测试工作
macro (do_test arg1 arg2 result)
  add_test (test_${arg1}_${arg2} main ${arg1} ${arg2})
  set_tests_properties (test_${arg1}_${arg2}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
 
# 利用 do_test 宏,测试一系列数据
do_test (5 2 "is 25")
do_test (10 5 "is 100000")
do_test (2 10 "is 1024")
  • build
mkdir build && cd build 
cmake ..
make
./hello
OFDM(正交频分复用)是一种高效的多载波通信技术,它将高速数据流拆分为多个低速子流,并通过多个并行的低带宽子载波传输。这种技术具有高频谱效率、强抗多径衰落能力和灵活的带宽分配优势。 OFDM系统利用大量正交子载波传输数据,子载波间的正交性可有效避免码间干扰(ISI)。其数学表达为多个离散子载波信号的线性组合,调制和解调过程通过FFT(快速傅立叶变换)和IFFT(逆快速傅立叶变换)实现。其关键流程包括:数据符号映射到子载波、IFFT转换为时域信号、添加循环前缀以减少ISI、信道传输、接收端FFT恢复子载波数据和解调原始数据。 Matlab是一种广泛应用于科研、工程和数据分析的高级编程语言和交互式环境。在OFDM系统设计中,首先需掌握Matlab基础,包括编程语法、函数库和工具箱。接着,根据OFDM原理构建系统模型,实现IFFT/FFT变换、循环前缀处理和信道建模等关键算法,并通过改变参数(如信噪比、调制方式)评估系统性能。最后,利用Matlab的绘图功能展示仿真结果,如误码率(BER)曲线等。 无线通信中主要考虑加性高斯白噪声(AWGN),其在频带上均匀分布且统计独立。通过仿真OFDM系统,可在不同信噪比下测量并绘制BER曲线。分析重点包括:不同调制方式(如BPSK、QPSK)对BER的影响、循环前缀长度选择对性能的影响以及信道估计误差对BER的影响。 OFDM技术广泛应用于多个领域,如数字音频广播(DAB)、地面数字电视广播(DVB-T)、无线局域网(WLAN)以及4G/LTE和5G移动通信,是这些通信标准中的核心技术之一。 深入研究基于Matlab的OFDM系统设计与仿真,有助于加深对OFDM技术的理解,并提升解决实际通信问题的能力。仿真得到的关键性能指标(如BER曲线)对评估系统可靠性至关重要。未来可进一步探索复杂信道条件下的OFDM性能及系统优化,以适应不同应用场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值