1 程序生成的三个阶段

1.1 编译:只产生符号表
1.2 链接:符号表需找到定义
1.3 执行:一步步执行函数

2 cmake文件

cmake文件主要分为两块,一个是cgsl.cmake文件,主要是设置交叉编译环境;另一个是CMakeLists.txt文件,主要是编译源文件生成动态库、静态库、可执行程序。
cmake命令最好在项目ouput目录下执行,防止生成的cmake过程文件影响源码。如下所示:前面指定cgsl.cmake,后面指定cmake根目录,根目录下通常有公用的cmakelist.txt文件设置公用名称或者路径并指定下一层编译路径。

#cmake命令执行时需要指定源目录,源目录中必须存放cmakelist.txt文件
#执行cmake命令的目录为输出目录
cmake -DCMAKE_TOOLCHAIN_FILE=${root_path}/project/cgsl.cmake -DCMAKE_BUILD_TYPE=Release ${root_path}/project/prj_${build_exe}/${build_exe}/cmakelist

2.1 创建csgl.cmake文件

交叉编译环境设置主要是为了跨平台编译,例如从linux转arm,只需要改动编译设置就可以生成不同平台的程序。

#设置编译系统名称
	SET(CMAKE_SYSTEM_NAME Linux)
	#设置编译系统处理器型号
	SET(CMAKE_SYSTEM_PROCESSOR x86_64)
	#取环境变量,设置编译器路径
	SET(tools $ENV{CROSS_TOOL_PATH})
	#设置编译器查找根目录
	SET(CMAKE_FIND_ROOT_PATH  ${tools}/ppc_74xx /home/alex/eldk-ppc74xx-inst)
	#设置C和C++编译器路径
	SET(CMAKE_C_COMPILER	${tools}/usr/bin/ppc_74xx-gcc)
	SET(CMAKE_CXX_COMPILER	${tools}/usr/bin/ppc_74xx-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)
	SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

2.2 创建公用cmakelist.txt文件和Config.h.in文件

2.2.1 公用cmakelist.txt文件

#指定cmake最低编译版本
cmake_minimum_required (VERSION 2.6)
#当前项目名称
project (PSLIB)
#CCache加快编译
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
    message(STATUS "use ccache")
endif(CCACHE_FOUND)
#支持c++11标准
if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
    message(STATUS "optional:-std=c++11")
endif(CMAKE_COMPILER_IS_GNUCXX)
#设置定义,告警级别等
add_definitions("-w -Wall ")
#设置全局变量
set (VERSION_MAJOR 100)
set (VERSION_MINOR 0)
#可以把Config.h.in文件中定义的未指定参数用cmakelist文件中指定全局变量替换
#并在输出目录中生成Config.h头文件
configure_file (
  ${PROJECT_SOURCE_DIR}/Config.h.in
  ${PROJECT_BINARY_DIR}/Config.h
  )
#可选pclint告警
option(MAKE_PCLINT on)
#设置全局路径和名称绑定
set(ROOT_PATH ${PROJECT_SOURCE_DIR}/../../../../)
set(CODE_PATH ${ROOT_PATH}/code)
set(TARGET_PATH ${ROOT_PATH}/target)
set(PRJ_PATH ${ROOT_PATH}/project)
#设置当前cmake执行后生成库和可执行文件保存目录
set(LIBRARY_OUTPUT_PATH ${TARGET_PATH}/prj_ps_pub/lib)
set(EXECUTABLE_OUTPUT_PATH ${TARGET_PATH}/prj_ps_pub/exe)
#设置全局头文件目录和名称绑定
set(PRJ_INCLUDE_PATH
	${PROJECT_BINARY_DIR}
)
#设置全局包含目录
include_directories(${PRJ_INCLUDE_PATH})
#添加下一层cmake目录
add_subdirectory(ps_pub)

2.2.2 公用Config.h.in

#define VERSION_MAJOR @VERSION_MAJOR@
#define VERSION_MINOR @VERSION_MINOR@

2.3 独立cmakelist.txt

#设置头文件目录和名称绑定
set(PRJ_MODULE_INCLUDE_PATH
    ${CODE_PATH}/pub/include
    ${CODE_PATH}/fun1/include
	${CODE_PATH}/fun2/include
)
#设置头文件目录
include_directories(${PRJ_MODULE_INCLUDE_PATH})
#设置源文件目录,并和MODULE_SRC_FILE名称绑定,不能参照头文件方式分开写
aux_source_directory(${CODE_PATH}/pub/source MODULE_MAIN_FILE)
aux_source_directory(${CODE_PATH}/fun1/source MODULE_SRC1_FILE)
aux_source_directory(${CODE_PATH}/fun2/source MODULE_SRC2_FILE)
#生成动态库 please put in /lib or /usr/lib,生成的库名为libFUN1.so
add_library (FUN1 SHARED ${MODULE_SRC1_FILE})
#生成静态库,生成的库名为libFUN_2.a
add_library (FUN2 SHARED ${MODULE_SRC2_FILE})
set_target_properties (FUN2 PROPERTIES OUTPUT_NAME "FUN_2")

#设置库目录
set(PRJ_MODULE_LINK_PATH
    ${LIBRARY_OUTPUT_PATH_1}
    ${LIBRARY_OUTPUT_PATH_2}
	)
#链接库目录
link_directories(${PRJ_MODULE_LINK_PATH})
#生成可执行文件
add_executable(DEMO_A ${MODULE_MAIN_FILE})
#可执行文件链接
target_link_libraries(DEMO_A -lFun_1 -lFUN_2)