Ч:)>Господа, помогите с проблемой!
Ч:)>Имеется DLL (API некоего устройства), LIB-файл к ней, H-файл, DEF-файл. Исходников нет. LIB-файл подключаю к проекту. При сборке мне говорят:
Ч:)>Linking...
Ч:)>AcProtDlg.obj : error LNK2001: unresolved external symbol "int __stdcall TmDriverPresent(void)" (?TmDriverPresent@@YGHXZ)
Ч:)>Debug/AcProt.exe : fatal error LNK1120: 1 unresolved externals
Ч:)>-----------------------------------------------------------------
Ч:)>Сказали мне, что это может быть из-за неправильного LIB-файла.
Ч:)>Так ли это? И главное, каким образом могу я создать новый LIB?
Вообще, смахивает на неправильный mangling имен. Для начала посмотри, есть ли в lib'e TmDriverPresent или ?TmDriverPresent@@YGHXZ (с помощью dumpbin).
Судя по тому, что есть DEF-файл, имя будет _TmDriverPresent или TmDriverPresent, линкер же ищет ?TmDriverPresent@@YGHXZ.
Попробуй поправить в H-файле декларацию int __stdcall TmDriverPresent(void) на extern "C" int __stdcall TmDriverPresent(void).
Или сделай свой def-файл с секцией IMPORTS (ни разу не пробовал, но вроде можно, хотя и недокументировано).
Или попробуй указать линкеру опцию /import (тоже не документирвана :-\, но синтаксис, скорее всего, как у /export)
Или используй ее из C, а не из C++.
Или используй LoadLibrary/GetProcAddress.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Z>>Здравствуйте Lefay, Вы писали:
L>>>Не совсем понятно, что значит lib файл для dll библиотеки. Тут уж L>>>что-нить одно — либо dll(динамическая библиотека) либо lib(статическая)
Z>>Ну почему же? В lib'е могут быть заглушки к dll. L>Это то известно, но тогда зачем эту либу к проекту подцеплять, L>я и говорю — туториал посмотреть надо, а без сорцов конечно можно L>новую библиотеку скомпилить, но это весьма гемеройно
Вот инструкция по получению, на примере библиотеки qt-mt302.dll
Натравливаем на dll dumpbin
dumpbin /exports qt-mt302.dll > qt-mt302.def
Получаете примерно следующее
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file qt-mt302.dll
File Type: DLL
Section contains the following exports for qt-mt302.dll
0 characteristics
3C8405B9 time date stamp Tue Mar 05 04:39:37 2002
0.00 version
1 ordinal base
14402 number of functions
14402 number of names
Вы эту хрень надо маленько подредактировать чтобы получить настоящий def файл
(Удаляете весь заголовок, лишние столбцы, и дописываете заголовок
def файла). Получиться должно примерно так:
LIBRARY qt-mt302
EXPORTS
??0?$QAsciiDict@VQConnectionList@@@@QAE@ABV0@@Z
??0?$QAsciiDict@VQConnectionList@@@@QAE@H_N0@Z
??0?$QAsciiDictIterator@VQConnectionList@@@@QAE@ABV0@@Z
??0?$QAsciiDictIterator@VQConnectionList@@@@QAE@ABV?$QAsciiDict@VQConnectionList
@@@@@Z
??0?$QDict@VQLibrary@@@@QAE@ABV0@@Z
??0?$QDict@VQLibrary@@@@QAE@H_N@Z
??0?$QDict@VQStyleSheetItem@@@@QAE@ABV0@@Z
??0?$QDict@VQStyleSheetItem@@@@QAE@H_N@Z
Теперь вы на все это натравливаете Lib
lib /DEF:qt-mt302.def
В результате получаете qt-mt302.lib который используете в проекте
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Господа, помогите с проблемой!
Имеется DLL (API некоего устройства), LIB-файл к ней, H-файл, DEF-файл. Исходников нет. LIB-файл подключаю к проекту. При сборке мне говорят:
Linking...
AcProtDlg.obj : error LNK2001: unresolved external symbol "int __stdcall TmDriverPresent(void)" (?TmDriverPresent@@YGHXZ)
Debug/AcProt.exe : fatal error LNK1120: 1 unresolved externals
-----------------------------------------------------------------
Сказали мне, что это может быть из-за неправильного LIB-файла.
Так ли это? И главное, каким образом могу я создать новый LIB?
ЗЫ: Не бейте чайника :-/
Ч>Господа, помогите с проблемой!
Ч>Имеется DLL (API некоего устройства), LIB-файл к ней, H-файл, DEF-файл. Исходников нет. LIB-файл подключаю к проекту. При сборке мне говорят:
Ч>Linking...
Ч>AcProtDlg.obj : error LNK2001: unresolved external symbol "int __stdcall TmDriverPresent(void)" (?TmDriverPresent@@YGHXZ)
Ч>Debug/AcProt.exe : fatal error LNK1120: 1 unresolved externals
Ч>-----------------------------------------------------------------
Ч>Сказали мне, что это может быть из-за неправильного LIB-файла.
Не совсем понятно, что значит lib файл для dll библиотеки. Тут уж
что-нить одно — либо dll(динамическая библиотека) либо lib(статическая)
Может быть ты неправильно библиотеку подключаешь?
если правильно, то скорей всего тебе ее не удастся использовать.
Попоробуй туториал поискать.
В любом случае удачи тебе в твоих начинаниях
Ч>Так ли это? И главное, каким образом могу я создать новый LIB?
Ч>ЗЫ: Не бейте чайника
Взойти на гору можно разными путями, но само восхождение остается неизменным.
Здравствуйте Lefay, Вы писали:
L>Не совсем понятно, что значит lib файл для dll библиотеки. Тут уж L>что-нить одно — либо dll(динамическая библиотека) либо lib(статическая)
Здравствуйте Zero, Вы писали:
Z>Здравствуйте Lefay, Вы писали:
L>>Не совсем понятно, что значит lib файл для dll библиотеки. Тут уж L>>что-нить одно — либо dll(динамическая библиотека) либо lib(статическая)
Z>Ну почему же? В lib'е могут быть заглушки к dll.
Это то известно, но тогда зачем эту либу к проекту подцеплять,
я и говорю — туториал посмотреть надо, а без сорцов конечно можно
новую библиотеку скомпилить, но это весьма гемеройно
Взойти на гору можно разными путями, но само восхождение остается неизменным.
Re: LIB из DLL. Как?
От:
Аноним
Дата:
23.04.02 11:39
Оценка:
Здравствуйте :-), Вы писали:
Ч:)>Имеется DLL (API некоего устройства), LIB-файл к ней, H-файл, DEF-файл. Исходников нет. LIB-файл подключаю к проекту.
Попробуй получить новый LIB-файл.
implib.exe Name_lib.LIB Name_dll.DLL
Затем LIB-файл и DLL помести в тоже место где находится твой exe.
Присоедини статитически LIB-файл к проекту.
Сделай #include H-файл.
Пролинкуй без использования функций из DLL,
а затем вызови что-нибудь.