封装一个cmake函数,能够自动导出当前模块的库和头文件的相对位置信息,并提供版本信息
时间: 2024-02-21 15:57:10 浏览: 152
好的,可以使用以下的CMake函数来实现:
```cmake
# 定义函数 export_module
function(export_module MODULE_NAME MODULE_VERSION)
# 设置库文件输出路径
set(EXPORT_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib)
# 创建库文件输出路径
file(MAKE_DIRECTORY ${EXPORT_LIB_DIR})
# 设置头文件输出路径
set(EXPORT_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
# 创建头文件输出路径
file(MAKE_DIRECTORY ${EXPORT_INCLUDE_DIR})
# 设置库文件名
set(EXPORT_LIB_NAME ${MODULE_NAME})
# 添加库文件输出路径到 CMake 变量中
set(${MODULE_NAME}_LIBRARY_DIRS ${EXPORT_LIB_DIR} CACHE INTERNAL "")
# 添加头文件输出路径到 CMake 变量中
set(${MODULE_NAME}_INCLUDE_DIRS ${EXPORT_INCLUDE_DIR} CACHE INTERNAL "")
# 添加库文件名到 CMake 变量中
set(${MODULE_NAME}_LIBRARIES ${EXPORT_LIB_NAME} CACHE INTERNAL "")
# 导出版本信息
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/version.h.in"
"${EXPORT_INCLUDE_DIR}/version.h"
@ONLY
)
# 设置源文件编译选项
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# 编译库文件
add_library(${EXPORT_LIB_NAME} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 设置库文件输出路径
set_target_properties(${EXPORT_LIB_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${EXPORT_LIB_DIR})
# 导出头文件
file(GLOB_RECURSE EXPORT_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
foreach(EXPORT_HEADER ${EXPORT_HEADERS})
file(RELATIVE_PATH HEADER_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include ${EXPORT_HEADER})
get_filename_component(HEADER_DIR ${HEADER_PATH} DIRECTORY)
set(EXPORT_HEADER_DIR ${EXPORT_INCLUDE_DIR}/${HEADER_DIR})
file(MAKE_DIRECTORY ${EXPORT_HEADER_DIR})
configure_file(
${EXPORT_HEADER}
${EXPORT_HEADER_DIR}/${HEADER_PATH}
COPYONLY
)
endforeach()
# 添加库文件和头文件的相对路径到 CMake 变量中
foreach(EXPORT_HEADER_DIR ${EXPORT_INCLUDE_DIR})
get_filename_component(EXPORT_HEADER_DIR_NAME ${EXPORT_HEADER_DIR} NAME)
set(${MODULE_NAME}_INCLUDE_DIRS ${${MODULE_NAME}_INCLUDE_DIRS} ${EXPORT_HEADER_DIR_NAME} CACHE INTERNAL "")
endforeach()
set(${MODULE_NAME}_LIBRARY_DIRS ${${MODULE_NAME}_LIBRARY_DIRS} "." CACHE INTERNAL "")
endfunction()
```
该函数会自动将当前模块的库文件和头文件导出到指定的输出路径,并提供版本信息。函数的参数包括模块名称和模块版本。使用时,只需要调用该函数,并传入对应的参数即可。
例如,假设当前模块的名称为 my_module,版本为 1.0.0,则可以使用以下代码来导出模块:
```cmake
# 调用 export_module 函数
export_module(my_module 1.0.0)
# 添加库文件和头文件搜索路径
include_directories(${my_module_INCLUDE_DIRS})
link_directories(${my_module_LIBRARY_DIRS})
# 编译当前模块的测试代码
add_executable(test_my_module test.cpp)
target_link_libraries(test_my_module ${my_module_LIBRARIES})
```
在该例子中,我们调用了 export_module 函数来导出 my_module,然后将其库文件和头文件的搜索路径添加到 CMake 中,最后编译了一个测试程序并链接 my_module 库。
阅读全文