используя msvc lib в mingw - PullRequest
       11

используя msvc lib в mingw

5 голосов
/ 15 августа 2011

У меня есть аппаратное обеспечение (рентгеновский датчик), на котором есть средства разработки.но afaiu они встроены в msvc.так что у меня есть файл .lib и файл .dll.Если я включаю этот файл lib в свой проект (я использую qt), помещаю файл dll в папку exe и компилирую, используя опцию MSVC-Release, все работает.Но когда я пытаюсь скомпилировать, используя опцию mingw-Release.это не удается.

неопределенная ссылка на ` imp __ ZN6IDcDrv6CreateEPKci '

неопределенная ссылка на` imp __ ZN6IDcDrv14GetDeviceCountEv'

можете выкакой-то выход, чтобы я мог использовать эти библиотеки.и dll файлы с использованием компилятора mingw

ps: я попробовал и не смог impdef dclibsn.dll> dclib.def

dlltool -dllname dclibsn.dll --def dclib.def --output-lib libdclibsn.a

и вот так выглядит мой файл определения

LIBRARY "dclibsn.dll"
EXPORTS
??0DcDrv@@QAE@ABV0@@Z
??0DcDrv@@QAE@V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z
??0IDcDrv@@QAE@ABV0@@Z
??0IDcDrv@@QAE@XZ
??1DcDrv@@QAE@XZ
??4DcDrv@@QAEAAV0@ABV0@@Z
??4IDcDrv@@QAEAAV0@ABV0@@Z
?CaptureImage@DcDrv@@AAE_NHHHK_NHH@Z
?CloseUsbDevice@DcDrv@@AAE_NXZ
?ColumnDefectComp@DcDrv@@AAEGPBGH@Z
?CompensationImage@DcDrv@@AAEXPAGQAEHH@Z
?Create@IDcDrv@@SAPAVDcDrv@@PBDH@Z

обратите внимание на последнюю запись в этом файле (Create.) Я пытаюсь вызвать это в программе, и я получаю

(.text+0x1ad): undefined reference to `_imp___ZN6IDcDrv6CreateEPKci'

и если я заменю строку? Создать @ IDcDrv @@ SAPAVDcDrv @@ PBDH @ Z

с imp __ ZN6IDcDrv6CreateEPKci он компилируется, но выдает ошибку.

The procedure entry point _ZN6IDcDrv6CreateEPKci could not be located in the dynamic link library dclibsn.DLL. 

Ответы [ 4 ]

1 голос
/ 25 ноября 2011

Смотрите это: Как использовать библиотеки, скомпилированные с MingW в MSVC?

Я имею в виду окружение #include с внешним блоком "C". Потому что использование extern «C» будет указывать компилятору, что функции используют связь C, а не C ++, что не позволит ему выполнять манипулирование именами функций.

Я думаю, что искажение имени вызывает проблемы в связи. Не знаю, поможет ли это автоматическое использование DLL или нет. Надеюсь, что так и будет. Потому что мне нужно написать dll на основе CUDA в MSVC 2005 и использовать его в mingw.

Надеюсь, это поможет. : -

0 голосов
/ 24 июля 2014

Как заметил @thithon, ваша проблема - искажение имени в C. Как он предполагает, вы должны сделать внешнюю букву «С», чтобы избежать этого.

Ошибка точки входа в том, что у вас, вероятно, нет main () в вашей dll. Просто добавьте один (даже если он пустой, это не имеет значения), и эта ошибка исчезнет.

0 голосов
/ 25 ноября 2011

Здесь у вас есть простая проблема: схема искажения имени, т.е. отображение функций C ++ с возможно перегруженными именами в строки, которые идентифицируют функции только по имени, для компилятора MS и для GCC отличается.Таким образом, имена функций различны, и MingW ищет свой собственный искаженный формат имени (_ZN6IDcDrv6CreateEPKci) и не может найти искаженное имя (?Create@IDcDrv@@SAPAVDcDrv@@PBDH@Z).

Теперь, если эти две библиотекидействительно используют функции C ++, это тем лучше.Предположим, что вы передадите строку C ++ из библиотеки в вашу программу и обратно - нет абсолютно никакой гарантии, что реализация строки в MS совместима с реализацией GNU в двоичном формате, поэтому вы, вероятно, в конечном итоге столкнетесь с неприятными ошибками.

Однако, если интерфейс этих функций совместим с C (может быть выражен в терминах POD), вы можете объявить функции в блоке extern "C" и, таким образом, отключить искажение имени.Кажется, разработчики библиотеки, против которой вы строите, этого не делали.Если в этом нет необходимости (извините, я не могу разделить имена MSVC на сигнатуру функции, поэтому на самом деле не могу сказать), вам следует сообщить об ошибке в библиотеку и попросить их объявить интерфейс или как можно более крупные части с помощью extern "C".Если это невозможно, напишите в MSVC упаковщик, который вызывает их функции и объявляет свои собственные функции в extern "C".

0 голосов
/ 15 августа 2011

Я, конечно, не эксперт в этом вопросе, но я всегда думал, что проект, созданный с помощью mingw, не смог использовать какие-либо библиотеки DLL или библиотеки lib из проекта msvc, поскольку они созданы с использованием разных компиляторов.

...