FastXML代码编译和调试支持
平台:windows + vscode
编译器:cl.exe (MSVC 14.30.30705,推荐通过visual studio安装)
编译+链接
FastXML源代码提供了用于代码编译的Makefile.win
。但问题是编译后无法调试,也就是编译的时候没有存储调试信息。
注意到在Windows平台下编译是利用的cl.exe
,而似乎不能是gcc/g++
(FastXML用到了一些库是msvc特有的),所以需要在Makefile.win
里面指定cl编译选项/Zi
。
指定/Zi
之后仍然有问题,发现调试的时候程序不会在断点处暂停,经排查得知gdb
根本无法读取cl编译后的调试信息(有可能是gdb
版本问题)。按照引用
得到解决,主要是launch.json的配置不能采用gdb,而应该是cl(cl既能编译也能调试)。
launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "cl.exe - 生成和调试活动文件",
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}\\binaries\\Windows\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"preLaunchTask": "cl.exe build active file"
}
]
}
我也对Makefile.win
做了一定的修改:
INC=/I..\Tools\c++
CXXFLAGS=/O2
all: fastXML_train fastXML_predict
fastXML_train:
cl /Zi /EHsc \
/Fe:binaries\Windows\fastXML_train.exe \
/Fo:binaries\Windows\ \
$(CXXFLAGS) \
$(INC) \
fastXML_train.cpp \
fastXML.cpp \
..\Tools\c++\mat.cpp
fastXML_predict:
cl /Zi /EHsc \
/Fe:binaries\Windows\fastXML_predict.exe \
/Fo:binaries\Windows\ \
$(CXXFLAGS) \
$(INC) \
fastXML_predict.cpp \
fastXML.cpp \
..\Tools\c++\mat.cpp
clean:
del /f \
binaries\Windows\fastXML_train.exe \
binaries\Windows\fastXML_train.ilk \
binaries\Windows\fastXML_train.pdb \
binaries\Windows\fastXML_train.obj \
binaries\Windows\fastXML_predict.exe \
binaries\Windows\fastXML_predict.ilk \
binaries\Windows\fastXML_predict.pdb \
binaries\Windows\fastXML_predict.obj \
binaries\Windows\fastXML.obj \
binaries\Windows\mat.obj \
用法:
cd FastXML
# 会在binaries/Windows文件夹下生成.obj文件, pdb文件, ilk文件, .exe文件
nmake -f Makefile.win
# 清除已生成的文件
nmake -f Makefile.win clean
单独编译+链接
也可以采用单独编译的方法(不使用makefile),需要配置tasks.json如下:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "Compile with CL",
"command": "cl.exe",
"args": [
"/O2",
"/Zi",
"/c",
"/EHsc",
"/Fo:${fileDirname}\\binaries\\Windows\\${fileBasenameNoExtension}.obj",
"${file}",
"/I${workspaceFolder}\\Tools\\c++"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$msCompile"
],
"group": "build",
"detail": "编译器: cl.exe"
}
]
}
注意需要指定编译选项/c
表示只编译,不链接。
如上会在binaries\Windows文件夹下生成.obj文件
链接命令:
link /DEBUG:FULL binaries/Windows/fastXML_train.obj binaries/Windows/fastXML.obj binaries/Windows/mat.obj /OUT:binaries/Windows/fastXML_train.exe
link /DEBUG:FULL binaries/Windows/fastXML_predict.obj binaries/Windows/fastXML.obj binaries/Windows/mat.obj /OUT:binaries/Windows/fastXML_predict.exe
这样就在binaries/Windows
文件夹生成了.exe文件。