【交叉编译一】CMake编译选项

1、常用的CMake选项具体含义如下:

 PROJECT(目标名称)

 ADD_DEFINITIONS(-g)   添加了之后,就相当于在编译的时候加上了 -g选项

ADD_DEFINITIONS(-Os)    添加了之后,就相当于在编译的时候加上了 -Os选项

ADD_DEFINITIONS(-D DEBUG_WARN)      将在gcc命令行添加DEBUG_WARN宏定义

SET(CMAKE_CXX_FLAGS "")                 编译器选项设置
SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS ""

SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-export-dynamic")     不导出所有的全局符号到动态符号表中

SET(CMAKE_SYSTEM_NAME linux)
SET(TOOLCHAIN_DIR "编译链目录")
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}C编译链)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}C++编译链)

INCLUDE_DIRECTORIES(目录)       编译使用的头文件

SET(SRCSRC_DIRS     目录)     编译的源文件路径

list(APPEND SOURCES  ${SRCSRC_DIRS }/xx.c)   指定编译的源文件

LINK_DIRECTORIES(目录)    依赖库的路径

SET(LIBS_LIB 库名称)    依赖的库

LINK_LIBRARIES(pthread rt m ${LIBS_LIB }  dl)   需要链接的库

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../Bin/)   指定生成的文件路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../Bin/)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../Bin/)

ADD_LIBRARY(${PROJECT_NAME} SHARED ${SOURCES})   动态库

ADD_LIBRARY(${PROJECT_NAME} STATIC ${SOURCES})     静态库

ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCES})    可执行文件

TARGET_LINK_LIBRARIES(${PROJECT_NAME} -Wl,--start-group  ${LIBS_LIB}  -Wl,--end-group)  解决链接时静态库顺序问题

2、部分内容说明

-g 生成调试信息

-O0 不进行优化处理

-O 或 -O1 优化生成代码

-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数

-Os:执行所有不增加目标文件大小的-O2选项,并执行专门减小目标文件大小的优化选项

-Wall 生成所有警告信息

-Wl 将其后面的参数传递给链接器

3、GCC/G++参数

-s  把符号表从最终的可执行文件中删除

-ffunction-sections  -fdata-sections  将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致

-fvisibility=hidden   设置源文件中符号的缺省可见性,设置为default时,没有显式标识为hidden的符号都处理为可见;设置为hidden时,没有显式标识为可见的符号都处理为隐藏,对于接口函数,可以在函数声明前添加__attribute__ ((visibility ("default"))),使其符号被单独导出

-fno-exceptions   禁用异常机制  一般只有对程序运行效率及资源占用比较看重的场合才会使用

-fno-rtti 禁用运行时类型信息      

-fno-unwind-tables

-fno-asynchronous-unwind-tables  禁止生成.eh_frame.eh_frame_hdr section

-fomit-frame-pointer  将 SFP可以在编译时候优化掉(arm平台上"-fomit-frame-pointer "选项的优化作用更加明显)

-Wl,-Bsymbolic 强制采用本地的全局变量定义,这样就不会出现动态链接库的全局变量定义被应用程序/动态链接库中的同名定义给覆盖了

连接时候使用的参数

-Wl,–gc-sections  去掉不用的section,减少程序的大小

-Wl,–no-export-dynamic  不导出所有的全局符号到动态符号表中

 

### 配置CMake文件用于交叉编译 对于交叉编译环境下的项目构建,配置合适的工具链文件至关重要。当针对像STM32MP1这样的ARM架构处理器进行开发时,可以通过指定`CMAKE_TOOLCHAIN_FILE`来设置特定于目标平台的编译选项和路径[^1]。 具体来说,在命令行中执行如下指令可以启动基于给定工具链文件的CMake配置过程: ```bash cmake -D CMAKE_TOOLCHAIN_FILE=../cmake/arm_linux_setup_debug.cmake .. ``` 此操作告知CMake采用位于相对路径`../cmake/`目录下名为`arm_linux_setup_debug.cmake`的工具链定义来进行后续处理。 另外种方法是在CMakeLists.txt内部直接设定必要的变量以适应不同的主机与目标机差异。例如,通过显式指明使用的GCC编译器版本以及调整模块查找模式可实现这点: ```cmake set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) ``` 上述代码片段展示了如何自定义CMake脚本来支持AARCH64 Linux系统的交叉编译需求[^2]。这里的关键在于正确设置了编译器路径,并且合理控制了库和头文件的搜索策略,从而确保所有依赖项都能被正确定位并链接到最终产物上。 为了使这些更改生效,应当将这段配置加入项目的根级CMakeLists.txt文件之中,或者创建个新的独立工具链文件供不同项目共享使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值