需求
- CMake工程中多个cpp文件分别生成exe可执行文件
- 调用第三方静态和动态库
方法
先上CMakeLists.txt吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| 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()
|
- 关于生成多个可执行文件
主要就是对于每个cpp分别进行操作,链接库之类的
我Cmake里使用了file和foreach,可以减少行数。
- 关于调用第三方库
代码中注释也说了,如果第三方库里有.cmake文件可以直接调用find_package找路径,具体可以打开.cmake文件看看
如果没有的话就需要自己也用set设置路径变量
一般来说用link_directories、target_link_libraries就能够链接库文件了。
但我出现了以下问题

通过网上查询资料,猜测是没找到dll文件的位置。
此时需要将dll添加到build文件夹里,详情见cmakelists文件。
理论上添加环境变量也是可以的,但是我并没有成功,原因未知。
结语
说实话,到最后CMakeLists还是一头雾水,莫名其妙地成功了,很多东西都是囫囵吞枣,能用就不深究,这样属实不行,将来必然吃亏。有时间还是得多多了解多多写。