如何在VS2010中构建Interactive Brokers API c++测试套接字客户端?

How can the Interactive Brokers API C++ test socket client be built with VS2010

本文关键字:c++ API 测试 套接字 客户端 Brokers Interactive VS2010 构建      更新时间:2023-10-16

按照这里给出的说明http://www.interactivebrokers.com/php/apiUsersGuide/apiguide.htm#apiguide/c/using_the_c__testsocketclient_sample_program.htm在Visual Studio Professional 2010中,c++项目总是给出以下输出:

1>  Generating Code...
1>LIBCMT.lib(invarg.obj) : error LNK2005: __initp_misc_invarg already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __call_reportfault already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler already defined in libcmtd.lib(invarg.obj)
1>     Creating library C:SyncingVCPlusPlusIBTestSocketClientVS2010DebugSampleSocketClient.lib and object C:SyncingVCPlusPlusIBTestSocketClientVS2010DebugSampleSocketClient.exp
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>C:SyncingVCPlusPlusIBTestSocketClientVS2010DebugSampleSocketClient.exe : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.
1>
1>Time Elapsed 00:01:30.63
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

如果有人有这样的经验或知道如何修复这个错误,将不胜感激!

我想我已经为你找到答案了。我遵循了错误LNK2005描述的指示,它表明在幕后发生了一些双重链接的事情。

你唯一需要做的就是改变你的项目的属性配置:

Properties->Linker->Input->Ignore Specific Default Libraries

在这里,你应该设置你想忽略的库libcmt.lib。设置完成后,您应该看到Ignore Specific Default Libraries的值为:

libcmt.lib;%(IgnoreSpecificDefaultLibraries)

然后构建,binggo~~~~请尝试一下

看起来您需要修复您的库引用。从下面的错误来看,你的项目同时引用了发布和调试版本,因此链接器不确定在哪里寻找特定的符号,因为它在多个地方(包括调试和发布)定义:

BlockquoteLIBCMT.lib(invarg.obj):错误LNK2005: __pinvalidarghandler已经定义在libcmtd.lib(invarg.obj)

如果您没有引用任何库,而IB dll在幕后执行此操作,您可能需要通过VS.

探索NODEFAULTLIB选项。

问题是PosixSocketClient代码假设当使用Microsoft编译器编译时,将使用Microsoft Foundation Library (MFC)。也许它过去是这样工作的,但我从来没有让它与VS2010一起工作。但我确实通过删除对/链接与MFC的依赖而使其工作。

不幸的是,如果定义了_MSC_VER,则Shared子文件夹中的代码将自动假定为MFC。(_MSC_VER给出了微软c++编译器的版本)。它不能被简单地undef化,因为一些标准的Windows头文件使用它。这显然是一个bug,因为MFC的存在是由_MFC_VER发出的,而不是_MSC_VER。因此我必须改变

#ifdef _MSC_VER

EClientSocketBaseImpl.h into

#ifdef _MFC_VER

另外,在文件_StdAfx.h中,#include <afxwin.h>应该另外包装在条件编译指令中:

#ifdef _MFC_VER
#include <afxwin.h>
#endif