Windows下使用vs2017搞CMake工程,示例是生成动态库和生成exe的工程

748 阅读2分钟

汇总,先说CMakeSettings.json

  • 它是生成库文件的工程和生成exe的工程都有的
  • 作用是生成相应的文件夹,在离他最近的CMakeList.txt右键 --> 缓存,即生成相应目录
    {
      "configurations": [
        {
          "name": "x64-Release",
          "generator": "Ninja",
          "configurationType": "RelWithDebInfo",
          "inheritEnvironments": [
            "msvc_x64_x64"
          ],
          "buildRoot": "F:/Project/breakpad/build_lib/build",  
          // 该变量可以不设置
          // "installRoot": "F:/Project/breakpad/build_lib/build",
          "cmakeCommandArgs": "",
          "buildCommandArgs": "-v",
          "ctestCommandArgs": ""
        }
      ]
    }  
    

接到讲下CMakeList.txt学习要点

  • 生成版本Release设置
  • 换行,是不需要换行符的
  • 如何生成(不管是release还是在debug模式)pdb,增量编译

涉及到dump调试的相关东西

  • exe会记住它出生时的pdb的文件路径(其实在调试,加载dmp文件时也可以指定pdb位置)
  • 调试dmp主要就是根据pdb中的符号来调试
  • 注意: exe pdb dmp 源码保持版本绝对一致!!退而求其次exe pdb dmp保持版本一致,若是源码有改动,可能解析到的源码位置就不准,pdb记录了exe中符号在源码中的位置,如果改动源码,特别是函数的相对位置有改动可能就回溯不准了

生成breakpad的静态库的CMakeList.txt

cmake_minimum_required (VERSION 3.8)  
# 设置字符集  
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /UMBCS /D_UNICODE /DUNICODE") 
set(CMAKE_BUILD_TYPE "Release") 

set(CPP_SRC F:/Project/breakpad/src/client/windows/handler/exception_handler.cc 
        F:/Project/breakpad/src/common/windows/string_utils.cc    
        F:/Project/breakpad/src/common/windows/guid_string.cc 
        F:/Project/breakpad/src/client/windows/crash_generation/crash_generation_client.cc)  

include_directories(F:/Project/breakpad/src F:/Project/breakpad/src/common/windows   
        F:/Project/breakpad/src/client/windows/handler F:/Project/breakpad/src/client/windows/common   
        F:/Project/breakpad/src/google_breakpad/common F:/Project/breakpad/src/client/windows/crash_generation F:/Project/breakpad/src/common)

set(LIB_PATH F:/Project/breakpad/build_lib/build)
# 生成静态库,将源代码添加到此项目的可执行文件。
 add_library(breakpad STATIC ${CPP_SRC})      

先生成动态库失败,主要是没能生成导入库.lib,只生成了.dll查了资料,还没看到有第二个用msvcCMake来生成动态库,都是用MiGwin搞的,还是贴一下生成dllCMakeList.txt

参考:www.jianshu.com/p/06d519f54…

cmake_minimum_required (VERSION 3.8)  
# 设置字符集 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /UMBCS /D_UNICODE /DUNICODE") 
set(CMAKE_BUILD_TYPE "Release") 

set(CPP_SRC F:/Project/breakpad/src/client/windows/handler/exception_handler.cc 
       F:/Project/breakpad/src/common/windows/string_utils.cc    
       F:/Project/breakpad/src/common/windows/guid_string.cc 
       F:/Project/breakpad/src/client/windows/crash_generation/crash_generation_client.cc)  

include_directories(F:/Project/breakpad/src F:/Project/breakpad/src/common/windows   
       F:/Project/breakpad/src/client/windows/handler F:/Project/breakpad/src/client/windows/common   
       F:/Project/breakpad/src/google_breakpad/common F:/Project/breakpad/src/client/windows/crash_generation F:/Project/breakpad/src/common)

set(LIB_PATH F:/Project/breakpad/build_lib/build)
# 生成动态库
# 指定dll的生成目录这里目录是 F:/Project/breakpad/build_lib/build  
# 注意linux下是LIBRARY DESTINATION  windows下是 RUNTIME DESTINATION
add_library(breakpad SHARED ${CPP_SRC})  
# linux下 ARCHIVE 变量才会起作用
# install(TARGETS breakpad RUNTIME DESTINATION ${LIB_PATH} ARCHIVE DESTINATION ${LIB_PATH})       
install(TARGETS breakpad RUNTIME DESTINATION ${LIB_PATH})     

生成exe工程的CMakeList.txt,它刚好用了上面生成的breakpad静态库

cmake_minimum_required (VERSION 3.8)
# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /UMBCS /D_UNICODE /DUNICODE") 
# 设置工程模式的重要语句, 如下可替换成 RELEASE
# set(CMAKE_BUILD_TYPE "DEBUG") 
# set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MD")  

set(CMAKE_BUILD_TYPE "RELEASE") 
# 想在release模式生成 pdb文件 /Zi增量编译,pdb文件增量,更准确接近于源码
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /Zi")  
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")

include_directories(F:/Project/breakpad/src F:/Project/breakpad/src/common/windows   
	F:/Project/breakpad/src/client/windows/handler F:/Project/breakpad/src/client/windows/common   
	F:/Project/breakpad/src/google_breakpad/common F:/Project/breakpad/src/client/windows/crash_generation F:/Project/breakpad/src/common)  

link_directories(F:/Exercises/breaklib_test/breaklib_test)
add_executable (breaklib_test "breaklib_test.cpp")
target_link_libraries(breaklib_test breakpad)