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 不导出所有的全局符号到动态符号表中