添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 创建了一个动态库,再由主项目调用该动态库。
  • find<lib库名>.cmake的内容是: 1.定义动态库的头文件所在路径 2. 定义库所在路径
  • 写好cmake文件后,也可以方便给其他人调用,省却了编写的麻烦
  • │ CMakeLists.txt # cmake的配置文件 ├─build # 存放 cmake配置生成的文件 ├─cmake │ findcalc.cmake # 动态库的cmake文件 ├─ext # 第三方库存放目录 │ └─calc # 编写的动态库存放目录 │ ├─dll # dll 文件所在目录 │ │ └─debug # debug配置下生成的动态库 │ │ calc.dll │ │ │ ├─include # 动态库头文件所在路径 │ │ calc_interface.h │ │ │ └─lib # 动态库的库文件 │ calc.lib └─src # 主项目的源文件 main.cc

    动态库已经写好,下面开始编写配置文件。

    编写 find<lib库名>.cmake文件

    正如上面的名字,我这里定义的是名为 findcalc.cmake 的文件,放在 cmake 目录下,内容如下

    # 指定库头文件所在路径
    FIND_PATH(calc_INCLUDE_DIR calc_interface.h ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/include)
    # 指定库文件所在路径
    FIND_LIBRARY(calc_LIBRARY calc.lib ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/lib)
    # 为了下游可以继续使用
    set(calc_FOUND FALSE)
    if (calc_INCLUDE_DIR AND calc_LIBRARY)
    	set(calc_FOUND TRUE)
    endif()
    

    这个文件主要用于CMakeLists.txt中引用动态库

    编写CMakeLists.txt

    指定cmake版本

    cmake_minimum_required(VERSION 3.18)
    

    指定项目名

    PROJECT(lib_demo)
    

    将主项目src文件夹下的所有源文件拷贝到变量demo_src

    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src demo_src)
    

    指定 cmake搜索库路径

    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
    

    重点来了,项目引用动态库

    重点来了,项目引用动态库

    重点来了,项目引用动态库

    FIND_PACKAGE(calc REQUIRED)
    

    创建可执行程序

    add_executable(${PROJECT_NAME} ${demo_src})
    

    主项目指定动态库头文件路径

    target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})
    

    注意calc_INCLUDE_DIR来自cmake文件中定义的变量,方便下游使用

    主项目连接动态库

    target_link_libraries(${PROJECT_NAME} PUBLIC ${calc_LIBRARY})
    

    拷贝动态库到可执行目录下

    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/dll/$<CONFIGURATION>"
            $<TARGET_FILE_DIR:${PROJECT_NAME}>)
    

    cmake配置结果

    转到 build目录,执行cmake .. 即可生成对应的 VS解决方案

    使用VS打开解决方案,并生成对应的可执行程序,同时可以看见 ,dll文件已经拷贝到生成的目录下

  • 生成前, 没有debug目录
  • 生成后,debug目录

    完整的CMakeLists.txt

    cmake_minimum_required(VERSION 3.18)
    PROJECT(lib_demo)
    # 2. to get all source files
    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src demo_src)
    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
    FIND_PACKAGE(calc REQUIRED)
    if (calc_FOUND)
    	add_executable(${PROJECT_NAME} ${demo_src})
    	# 指定库头文件路径
    	target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})
    	# 指定库名
    	target_link_libraries(${PROJECT_NAME} PUBLIC ${calc_LIBRARY})
    	add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/dll/$<CONFIGURATION>"
            $<TARGET_FILE_DIR:${PROJECT_NAME}>)
    else()
    	message(status "its not found")
    endif(calc_FOUND)
    
  •