汇总,先说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
查了资料,还没看到有第二个用msvc
和CMake
来生成动态库,都是用MiGwin
搞的,还是贴一下生成dll
的CMakeList.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)