编译库
编译库按照以下步骤依次进行
设置库编译出来后存放的路径,该配置可放在*.cmake中
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/target/libs)
设置库的名称:set
编译库的名称设置为test_lib,保存到变量SOURCE_LIB中
set(SOURCE_LIB test_lib)
添加库源码:aux_source_directory
将编译库所需的源码保存到变量CODE_SOURCE中
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src CODE_SOURCE)
编译动态库:add_library:SHARED
add_library(${SOURCE_LIB} SHARED ${CODE_SOURCE})
编译静态库:add_library:STATIC
add_library(${SOURCE_LIB} STATIC ${CODE_SOURCE})
编译静态库与动态库根据项目情况两者二选一
添加头文件:target_include_directories
头文件设置公共头文件
target_include_directories(${SOURCE_LIB}
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc)
- 可选项:添加子目录代码
若源码在子目录下,采用add_subdirectory添加子目录文件夹。
然后采用target_sources添加源码。采用target之前,add_subdirectory要放在添加库之后
add_subdirectory(add_code)
在add_code文件夹下,也放置有CMakeLists.txt文件
target_include_directories(${MODULE_LIB}
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_CODE)
target_sources(${MODULE_LIB} PRIVATE ${SRC_CODE})
- 可选项:添加库的版本描述:set_target_properties
该方法仅仅针对so库有效
set_target_properties(${SOURCE_LIB} PROPERTIES VERSION 1.2.3.4 SOVERSION 5)
编译出来的静态库库效果
:~/test_Makefile/target/libs$ ll
总用量 24
drwxrwxr-x 2 ghost ghost 4096 10月 8 20:14 ./
drwxrwxr-x 3 ghost ghost 4096 10月 8 20:14 ../
-rw-rw-r-- 1 ghost ghost 12716 10月 8 20:14 libtest_lib.a
编译出来的动态库库效果
:~/test_Makefile/target/libs$ ll
总用量 20
drwxrwxr-x 2 ghost ghost 4096 10月 8 20:11 ./
drwxrwxr-x 3 ghost ghost 4096 10月 8 20:11 ../
lrwxrwxrwx 1 ghost ghost 16 10月 8 20:11 libtest_lib.so -> libtest_lib.so.5*
-rwxrwxr-x 1 ghost ghost 12192 10月 8 20:11 libtest_lib.so.1.2.3.4*
lrwxrwxrwx 1 ghost ghost 22 10月 8 20:11 libtest_lib.so.5 -> libtest_lib.so.1.2.3.4*
库链接
当前编译的库,工程中的可执行文件需要用到,即可在此链接
target_link_libraries( ${PROJECT_APP} PRIVATE ${SOURCE_LIB})
安装库
将生成的库文件安装到指定路径或系统默认路径下
install(TARGETS ${SOURCE_LIB}
CONFIGURATIONS ${CMAKE_BUILD_TYPE}
ARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/target/${CMAKE_BUILD_TYPE}/staticLib
LIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/target/${CMAKE_BUILD_TYPE}/sharedLib)
编译库的CMakeLists.txt文件
set(SOURCE_LIB test_lib)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src CODE_SOURCE)
add_library(${SOURCE_LIB} ${LIB_TYPE} ${CODE_SOURCE})
target_include_directories(${SOURCE_LIB}
PRIVATE ${PROJECT_SOURCE_DIR}/src/include
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc)
set_target_properties(${SOURCE_LIB} PROPERTIES VERSION 1.2.3.4 SOVERSION 5)
target_link_libraries( ${PROJECT_APP} PRIVATE ${SOURCE_LIB})
install(TARGETS ${SOURCE_LIB}
CONFIGURATIONS ${CMAKE_BUILD_TYPE} # Debug 或 Release
ARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/target/${CMAKE_BUILD_TYPE}/staticLib #静态库安装路径
LIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/target/${CMAKE_BUILD_TYPE}/sharedLib) #动态库安装路径
编译可执行文件
设置可执行文件编译出来后的存放路径,该配置可放在*.cmake中
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/target)
设置可执行文件的名称:set
编译可执行文件的名称设置为project_app,保存到变量PROJECT_APP中
set(PROJECT_APP project_app)
添加编译文件:add_executable
add_executable(${PROJECT_APP})
添加源码:aux_source_directory
将编译所需的源码保存到变量CODE_SOURCE中
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src CODE_SOURCE)
添加头文件:target_include_directories
由于不是编译库文件,因此作用范围可以设置成PRIVATE
target_include_directories(${PROJECT_APP}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
- 可选项:链接库target_link_libraries
可执行文件如果需要用到库,即可连接对应的库文件,要保证库文件的头文件包含在target_include_directories或者编译时采用作用域PUBLIC进行编译
target_link_libraries( ${PROJECT_APP} PRIVATE
test_lib
algorithmTest
module)
这步如果有上面编译库的时候链接进来,可以忽略。
- 可选项:添加子目录代码
若源码在子目录下,采用add_subdirectory添加子目录文件夹。操作方法与添加库的方法一样。
安装可执行文件
将生成的可执行文件安装到指定路径或系统默认路径下
install(TARGETS ${PROJECT_APP}
CONFIGURATIONS ${CMAKE_BUILD_TYPE}
RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/target/${CMAKE_BUILD_TYPE})
编译可执行文件的CMakeLists.txt文件
set(PROJECT_APP project_app)
# 添加可执行文件
add_executable(${PROJECT_APP})
# 添加头文件依赖
target_include_directories(${PROJECT_APP}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
# 添加宏定义
target_compile_definitions(${PROJECT_APP}
PRIVATE -D DEFINE_TEST)
add_subdirectory(app)
add_subdirectory(lib)
add_subdirectory(system)
install(TARGETS ${PROJECT_APP}
CONFIGURATIONS ${CMAKE_BUILD_TYPE}
RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/target)