【交叉编译一】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  不导出所有的全局符号到动态符号表中

猜你喜欢

转载自blog.csdn.net/Swallow_he/article/details/110938522