LIB из DLL. Как?
От: Чайник :-) Россия  
Дата: 23.04.02 10:38
Оценка:
Господа, помогите с проблемой!
Имеется 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?
ЗЫ: Не бейте чайника :-/
Я не волшебник, я только учусь...
Re: LIB из DLL. Как?
От: Lefay Россия  
Дата: 23.04.02 11:06
Оценка:
Здравствуйте Чайник , Вы писали:

Ч>Господа, помогите с проблемой!
Ч>Имеется 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?
Ч>ЗЫ: Не бейте чайника
Взойти на гору можно разными путями, но само восхождение остается неизменным.
Re[2]: LIB из DLL. Как?
От: Zero  
Дата: 23.04.02 11:13
Оценка:
Здравствуйте Lefay, Вы писали:

L>Не совсем понятно, что значит lib файл для dll библиотеки. Тут уж

L>что-нить одно — либо dll(динамическая библиотека) либо lib(статическая)

Ну почему же? В lib'е могут быть заглушки к dll.
Re[3]: LIB из DLL. Как?
От: Lefay Россия  
Дата: 23.04.02 11:16
Оценка:
Здравствуйте Zero, Вы писали:

Z>Здравствуйте Lefay, Вы писали:


L>>Не совсем понятно, что значит lib файл для dll библиотеки. Тут уж

L>>что-нить одно — либо dll(динамическая библиотека) либо lib(статическая)

Z>Ну почему же? В lib'е могут быть заглушки к dll.

Это то известно, но тогда зачем эту либу к проекту подцеплять,
я и говорю — туториал посмотреть надо, а без сорцов конечно можно
новую библиотеку скомпилить, но это весьма гемеройно
Взойти на гору можно разными путями, но само восхождение остается неизменным.
Re: LIB из DLL. Как?
От: Sergey Россия  
Дата: 23.04.02 11:23
Оценка: 11 (3)
Здравствуйте Чайник :-), Вы писали:

Ч:)>Господа, помогите с проблемой!
Ч:)>Имеется 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?

Насчет создания нового lib смотри Q131313.

Вообще, смахивает на неправильный 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: LIB из DLL. Как?
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 23.04.02 11:30
Оценка: 1 (1)
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

ordinal hint RVA name

1 0 0005877C ??0?$QAsciiDict@VQConnectionList@@@@QAE@ABV0@@Z
2 1 0005875A ??0?$QAsciiDict@VQConnectionList@@@@QAE@H_N0@Z
3 2 00005FD7 ??0?$QAsciiDictIterator@VQConnectionList@@@@QAE@ABV0@@Z
4 3 000060BE
??0?$QAsciiDictIterator@VQConnectionList@@@@QAE@ABV?$QAsciiDict@VQConnectionList
@@@@@Z
5 4 0004C360 ??0?$QDict@VQLibrary@@@@QAE@ABV0@@Z
6 5 0004C340 ??0?$QDict@VQLibrary@@@@QAE@H_N@Z
7 6 00031C41 ??0?$QDict@VQStyleSheetItem@@@@QAE@ABV0@@Z
8 7 00031C21 ??0?$QDict@VQStyleSheetItem@@@@QAE@H_N@Z
9 8 00034CE4 ??0?$QDict@VQTextFormat@@@@QAE@ABV0@@Z
10 9 00034CC4 ??0?$QDict@VQTextFormat@@@@QAE@H_N@Z
11 A 0014D1C8 ??0?$QIntDict@H@@QAE@ABV0@@Z

Вы эту хрень надо маленько подредактировать чтобы получить настоящий 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 который используете в проекте
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
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,
а затем вызови что-нибудь.

Успехов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.