期货CTP在Windows上需要连接静态链接库,在VS2022一切正常,在VSCode却始终失败。
原因是Windows系统的dll用的vs编译器,导出的Dll没有用extern c ,gcc 编译各种坑。
最后通过在VSCode中配置VS2022的编译器,才终于成功。
VSCode项目文件夹下新建目录.vscode,目录下新建文件 settings.json 这样就可以只配置当前项目。
我习惯用Code Runner来运行代码,所以直接修改Code Runner的运行方式,在settings.json添加以下内容:
{"code-runner.executorMap": {"cpp": "cl $fileName /Fe$fileNameWithoutExt.exe /link /LIBPATH:d:/work_vscode/CTP/api thostmduserapi_se.lib thosttraderapi_se.lib && $fileNameWithoutExt.exe"}
}
/LIBPATH 后是链接库目录,后面2个是要链接的2个lib文件。
&& $fileNameWithoutExt.exe 表示前面命令完成后 执行生成的exe程序。
如果不想看到无关的提示输出,可以在&&前加上 >nul 2>&1
cl是vs2022得编译器,注意c后面是字母L的小写,不是数字1。接下来找到cl的路径,添加到系统环境变量。
我的路径是:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\Hostx64\x64
在cmd命令行输入 cl 验证是否添加成功。
微软官方msdn上介绍cl的使用方法是”开始“-”所有程序“-“Visual Studio 2013”-"Visual Studio Tools"再以管理员身份运行”VS2013开发人员命令提示”,之后可以正常用cl编译代码。
但在vscode运行cpp代码,依然会有问题,提示找不到头文件和库文件。
其实官方运行cl的方法是在运行cl之前执行了一个bat脚本D:\EEProgram\vsdesktop\Common7\Tools\VsDevCmd.bat,这个脚本设置了一些环境变量,除了path,还有INCLUDE 头文件的路径,LIB 库文件的路径。
在vscode或cmd中用cl命令会出现以下问题:
- fatal error C1034: Windows.h: 不包括路径集
- fatal error C1083: 无法打开包括文件: “winapifamily.h”
- fatal error C1083: 无法打开包括文件: “excpt.h”
- fatal error C1083: 无法打开包括文件: “ctype.h”
我的电脑上
Windows.h 所在目录 ·C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um
winapifamily.h 所在目录 C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared
excpt.h 在vs2022的目录下 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include
ctype.h 所在目录 C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt
新建环境变量 INCLUDE,把上面的路径作为值,一次性添加时用分号隔开
接下来是链接库的问题
- fatal error LNK1104: 无法打开文件“uuid.lib”
- fatal error LNK1104: 无法打开文件“LIBCMT.lib”
- fatal error LNK1104: 无法打开文件“libucrt.lib”
uuid.lib 所在目录 C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64
LIBCMT.lib 在vs2022的目录下 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\lib\x64
libucrt.lib 所在目录 C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64
新建环境变量 LIB,把上面的路径作为值,一次性添加时用分号隔开
注意:每次添加环境变量后,需要关闭vscode,然后再打开才能生效。用cmd也一样,需要重开cmd才有效。
现在已经完成编译了,但有个小问题,编译出来的程序,比在vs2022上的Release模式下编译的程序要大10多倍,即使用上cl的各种优化参数,结果变得更大了。所以在vscode上用cl编译,只适合做研发。最终发布最好还是在vs2022中完成。
参考资料:
- https://blog.csdn.net/zhouyang209117/article/details/17737413