Как построить клиент тестового сокета Interactive Brokers API C ++ с VS2010? - PullRequest
2 голосов
/ 24 октября 2011

Следуя инструкциям, приведенным здесь 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:\Syncing\VCPlusPlus\IBTestSocketClientVS2010\Debug\SampleSocketClient.lib and object C:\Syncing\VCPlusPlus\IBTestSocketClientVS2010\Debug\SampleSocketClient.exp
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>C:\Syncing\VCPlusPlus\IBTestSocketClientVS2010\Debug\SampleSocketClient.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 ==========

Если кто-то имел опыт или понимает, как исправить эту ошибку, это было бы очень признательно!

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Я думаю, что нашел ответ для вас.Я проследил за описанием ошибки LNK2005, и это указывает на то, что за кулисами происходит какая-то двойная связь.

Единственное, что вам нужно сделать, это изменить свойства вашего проекта. Конфигурация:

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

Здесь вы должны настроить библиотеку, которую хотите игнорировать, которая называется libcmt.lib.После настройки вы должны увидеть значение Игнорировать определенные библиотеки по умолчанию :

libcmt.lib;%(IgnoreSpecificDefaultLibraries)

Затем сборка, binggo ~~~~ Пожалуйста, попробуйте.

0 голосов
/ 19 ноября 2013

Проблема в том, что в коде PosixSocketClient предполагается, что при компиляции с помощью компилятора Microsoft будет использоваться библиотека Microsoft Foundation Library (MFC).Возможно, раньше это так и работало, но я никогда не работал с VS2010.Но я все заработал, убрав зависимость от / связывание с MFC.

К сожалению, код в подпапке Shared автоматически принимает MFC, если определено _MSC_VER.(_MSC_VER дает версию компилятора Microsoft C ++).Он не может быть просто undef -обработан, потому что некоторые стандартные заголовки Windows используют его.Это явно ошибка, поскольку наличие MFC сигнализируется _MFC_VER, а не _MSC_VER.Поэтому мне пришлось изменить

#ifdef _MSC_VER

везде в EClientSocketBaseImpl.h на

#ifdef _MFC_VER

Также, в файл _StdAfx.h, #include <afxwin.h> должен быть дополнительно упакованв директиве условной компиляции:

#ifdef _MFC_VER
#include <afxwin.h>
#endif
0 голосов
/ 24 октября 2011

Похоже, вам нужно исправить ссылки на lib. Судя по приведенной ниже ошибке, ваш проект ссылается как на версию выпуска, так и на версию отладки, поэтому компоновщик не уверен, где искать конкретные символы, поскольку он определен в нескольких местах (как отладка, так и выпуск):

BlockquoteLIBCMT.lib (invarg.obj): ошибка LNK2005: ___pInvalidArgHandler уже определен в libcmtd .lib (invarg.obj)

Если вы не ссылаетесь ни на какие библиотеки, и IB dll делает это за кулисами, вы можете изучить опцию NODEFAULTLIB через VS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...