Я пытаюсь создать консольное приложение WIN32, которое использует текущую статическую библиотеку 2.12.28 ftd2xx.lib от FTDI. Я использую VS2013 и собственный неуправляемый C++. Мой звонок выглядит так.
#include "../ftd2xx.h"
. . .
DWORD port_count = 0;
FT_STATUS status = FT_OK;
status = FT_CreateDeviceInfoList(&port_count);
Когда я компилирую, я получаю ошибку ссылки
GetTopazVCP.obj : error LNK2019: unresolved external symbol __imp__FT_CreateDeviceInfoList@4 referenced in function "unsigned long __cdecl Get1stVirtualComPort(unsigned long *)" (?Get1stVirtualComPort@@YAKPAK@Z)
Неразрешенный символ __imp__FT_CreateDeviceInfoList@4 выглядит как искаженная версия имени функции FT_CreateDeviceInfoList. Так что это не решается в ftd2xx.lib, который использует имена C. Чего я не понимаю, так это почему компилятор исказил имя, когда файл ftd2xx.h имеет условный внешний вид "C"
#ifdef __cplusplus
extern "C" {
#endif
. . .
FTD2XX_API
FT_STATUS WINAPI FT_CreateDeviceInfoList(
LPDWORD lpdwNumDevs
);
...
#ifdef __cplusplus
}
#endif
обертывание всех FT_??? декларации. Я подтвердил, что __cplusplus определяется во время компиляции. Любые идеи, что вызывает неожиданное искажение имени?
imp
означает, что код функции импортирован из библиотеки DLL (а не из статической библиотеки), а@n
— это просто часть имени функции (поскольку в ней используется соглашение о вызовах Microsoft__stdcall
вместо обычное соглашение о вызовах C (__cdecl
); это то, что означает макросWINAPI
в объявлении функции). Другими словами, здесь не происходит искажения имени C++, и у вас просто обычная ошибка компоновщика, предположительно потому, что вам не хватает библиотеки в настройках компоновщика вашего проекта. - person   schedule 03.11.2017