关于CMAKE项目生成多个可执行文件以及调用第三方库这件事

需求

  1. CMake工程中多个cpp文件分别生成exe可执行文件
  2. 调用第三方静态和动态库

方法

先上CMakeLists.txt吧。

cmake_minimum_required (VERSION 3.10)
project(Mosquitto)
# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")

# 设置变量
set(Mosquitto_DLL_DIR D:\\Program_Files\\Mosquitto)
set(Mosquitto_DIR D:\\Program_Files\\Mosquitto\\devel)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
  


# 生成时拷贝dll到Bin中
file(GLOB dll_src "${Mosquitto_DLL_DIR}/*.dll" )
file(COPY ${dll_src} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

# find_package(OpenCV  REQUIRED) 如果第三方库里有.cmake文件可以直接调用find_package找路径
# 头文件目录
include_directories(${Mosquitto_DIR})

# 库目录
link_directories(
    ${Mosquitto_DIR}
)

# 找到所有含有mian函数的cpp文件,保存在mians里
file(
    GLOB_RECURSE mains RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
    "${CMAKE_CURRENT_SOURCE_DIR}/subscribe.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/publish.cpp"
)
# 循环遍历每个含main的文件,分别编译生成exe文件
foreach(mainfile IN LISTS mains)
    # Get file name without directory
    get_filename_component(mainname ${mainfile} NAME_WE)
    add_executable(${mainname} ${mainfile})
    # 添加库文件目录
    target_link_libraries(${mainname} mosquitto mosquittopp)# 链接库文件
endforeach()
  1. 关于生成多个可执行文件
    主要就是对于每个cpp分别进行操作,链接库之类的
    我Cmake里使用了fileforeach,可以减少行数。
  2. 关于调用第三方库
    代码中注释也说了,如果第三方库里有.cmake文件可以直接调用find_package找路径,具体可以打开.cmake文件看看
    如果没有的话就需要自己也用set设置路径变量
    一般来说用link_directoriestarget_link_libraries就能够链接库文件了。
    但我出现了以下问题
    bug

通过网上查询资料,猜测是没找到dll文件的位置。
此时需要将dll添加到build文件夹里,详情见cmakelists文件。
理论上添加环境变量也是可以的,但是我并没有成功,原因未知。

结语

说实话,到最后CMakeLists还是一头雾水,莫名其妙地成功了,很多东西都是囫囵吞枣,能用就不深究,这样属实不行,将来必然吃亏。有时间还是得多多了解多多写。

如有兴趣,欢迎来访我的个人博客

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值