如何才能使CMake生成的可执行程序便于调试
1个回答
展开全部
出现的原因是导入的此makefile工程不是debug模式的,所以不包含调试信息,自然不能打断点调试了。因此,要解决这个问题就要考虑如何修改CMakeLists.txt使其生成的makefile文件进而生成Debug模式下的带调试信息的可执行程序;
我们先写一个简单的测试例子来测试一下,如何加调试信息:
假设文件结构如下:
./test6
|
+ ------ CmakeLists.txt
+ ------ main.cpp
+ ------ src_a
|
+ ------ CmakeLists.txt
+ ------ Testa.h
+ ------ Testa.cpp
+ ------ src_so
|
+ ------ CmakeLists.txt
+ ------ Testso.h
+ ------ Testso.cpp
第一步:test6目录下CmakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(main )
add_subdirectory(src_a ) // 给当前工程目录添加子目录 src_a
add_subdirectory(src_so ) // 给当前工程目录添加子目录 src_so
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息
set(EXECUTABLE_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置可执行文件的生成路径
include_directories($ {PROJECT_SOURCE_DIR}/src_a ${PROJECT_SOURCE_DIR}/src_so) //包含库头文件
aux_source_directory(. DIR_SRCS ) // 将当前目录中的源文件名称赋值给变量 DIR_SRCS
add_executable(main $ {DIR_SRCS}) //表示 DIR_SRCS中的源文件需要编译成名为 main的可执行文件
target_link_libraries (main Testa Testso) //将库文件链接到生成的目标可执行文件
第二步:子目录目录下CmakeLists.txt
1,src_a中静态库的编译生成
cmake_minimum_required(VERSION 3.3) //该命令限定了 CMake 的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息
set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置Lib 静态库生成路径
aux_source_directory(. LIBA_SRC) //将当前目录中的源文件名称赋值给变量 LIBA_SRC
add_library(Testad STATIC $ {LIBA_SRC}) //将变量 LIBA_SRC中的源文件编译为静态库,库文件名称为 Testa
2,src_so中动态库的编译生成
cmake_minimum_required(VERSION 3.3) //该命令限定了 CMake 的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息
set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置Lib 动态库库生成路径
aux_source_directory(. LIBSO_SRC) //将当前目录中的源文件名称赋值给变量 LIBA_SRC
add_library(Testsod SHARED $ {LIBSO_SRC}) //将变量 LIBA_SRC中的源文件编译为动态库,库文件名称为 Testso
此处执行cmake时有两种方式:
1,在cmake的gui界面中设定生成Debug模式,
2,在执行cmake时使用如下命令:cmake -DCMAKE_BUILD_TYPE=Debug/Release path
关于ccmake的使用,这里简单的做个说明:
1.首先在终端启动cmake的gui界面:"ccmake ." 效果如图:
2.然后在gui中输入"c",效果如图:
3.然后在gui中输入"e",效果如图:
4.此时在gui界面点击"enter"回车键进行编辑:编辑完再次点击回车退出编辑。
5.点击"c",之后再次点击"g"。此时makefile文件已经生成好了。make之后生成的可执行文件是带有调试信息的,就可用gdb进行调试了(导入Eclipse也可以进行打断点调试)。
我们先写一个简单的测试例子来测试一下,如何加调试信息:
假设文件结构如下:
./test6
|
+ ------ CmakeLists.txt
+ ------ main.cpp
+ ------ src_a
|
+ ------ CmakeLists.txt
+ ------ Testa.h
+ ------ Testa.cpp
+ ------ src_so
|
+ ------ CmakeLists.txt
+ ------ Testso.h
+ ------ Testso.cpp
第一步:test6目录下CmakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(main )
add_subdirectory(src_a ) // 给当前工程目录添加子目录 src_a
add_subdirectory(src_so ) // 给当前工程目录添加子目录 src_so
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息
set(EXECUTABLE_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置可执行文件的生成路径
include_directories($ {PROJECT_SOURCE_DIR}/src_a ${PROJECT_SOURCE_DIR}/src_so) //包含库头文件
aux_source_directory(. DIR_SRCS ) // 将当前目录中的源文件名称赋值给变量 DIR_SRCS
add_executable(main $ {DIR_SRCS}) //表示 DIR_SRCS中的源文件需要编译成名为 main的可执行文件
target_link_libraries (main Testa Testso) //将库文件链接到生成的目标可执行文件
第二步:子目录目录下CmakeLists.txt
1,src_a中静态库的编译生成
cmake_minimum_required(VERSION 3.3) //该命令限定了 CMake 的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息
set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置Lib 静态库生成路径
aux_source_directory(. LIBA_SRC) //将当前目录中的源文件名称赋值给变量 LIBA_SRC
add_library(Testad STATIC $ {LIBA_SRC}) //将变量 LIBA_SRC中的源文件编译为静态库,库文件名称为 Testa
2,src_so中动态库的编译生成
cmake_minimum_required(VERSION 3.3) //该命令限定了 CMake 的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息
set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置Lib 动态库库生成路径
aux_source_directory(. LIBSO_SRC) //将当前目录中的源文件名称赋值给变量 LIBA_SRC
add_library(Testsod SHARED $ {LIBSO_SRC}) //将变量 LIBA_SRC中的源文件编译为动态库,库文件名称为 Testso
此处执行cmake时有两种方式:
1,在cmake的gui界面中设定生成Debug模式,
2,在执行cmake时使用如下命令:cmake -DCMAKE_BUILD_TYPE=Debug/Release path
关于ccmake的使用,这里简单的做个说明:
1.首先在终端启动cmake的gui界面:"ccmake ." 效果如图:
2.然后在gui中输入"c",效果如图:
3.然后在gui中输入"e",效果如图:
4.此时在gui界面点击"enter"回车键进行编辑:编辑完再次点击回车退出编辑。
5.点击"c",之后再次点击"g"。此时makefile文件已经生成好了。make之后生成的可执行文件是带有调试信息的,就可用gdb进行调试了(导入Eclipse也可以进行打断点调试)。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询