Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
cuteprog
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 12
1

Подключение dll в MSVS 2010 C++

07.04.2013, 19:17. Просмотров 1321. Ответов 27
Метки нет (Все метки)

Код:
C++
1
2
3
4
__declspec(dllimport) int summe(int a);
void main(){
    summe(3);
}
При компиляции выдает следующую ошибку:
error LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl summe(int)" (__imp_?summe@@YAHH@Z) referenced in function _main.

Сам dll файл был создан в Delphi, вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
library mydll;
 
  function summe(var a: integer):integer; export;
  begin
    result:=a;
  end;
 
Exports 
summe index 1 name 'summe';
begin
end.
Для генерации mydll.lib файла был создан mydll.def со следующим содержимым:
EXPORTS
summe

Полученный в результате mydll.lib поместил в папку с проектом и прописал его в Linker -> Input -> Additional Dependencies.
Файл mydll.dll поместил в папку с exe-шником.

Что нужно сделать, что-бы оно заработало?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2013, 19:17
Ответы с готовыми решениями:

MSVS 2010. Автоматическое подключение stdafx.h ко всем новым проектам
Как сразу stdafx.h сделать со своим кодом по умолчанию ? как подключить...

Конвертировать с MsVS 2008 в MsVS 2010
У меня есть проект на MsVS 2008. Он состоит с нескольких файлов, которые потом...

MSVS 2010 Hello world
Скачал Vidual Studio 2010 Express, создал проект, скопипастил туда Helloworld....

Где находиться папка Source Files в MSVS 2010
Где находиться кнопка sources file? ( версия eng)

Проблемы с кодировкой при переключении из Debug в Release в MSVS 2010
Собираю проект в режиме дебаг все символы норм отображаются,переключаю на релиз...

27
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
07.04.2013, 19:27 2
cuteprog, указать соглашение о вызове.
Цитата Сообщение от cuteprog Посмотреть сообщение
Для генерации mydll.lib файла был создан mydll.def со следующим содержимым:
EXPORTS
summe
Посмотрите в dll экспортируется ли ваша функция.
1
cuteprog
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 12
07.04.2013, 19:45  [ТС] 3
Цитата Сообщение от go Посмотреть сообщение
Посмотрите в dll экспортируется ли ваша функция.
Как это сделать?

Добавлено через 7 минут
C:\Program Files\Microsoft Visual Studio 10.0\VC>dumpbin /exports C:\mydll.dll
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.


Dump of file C:\mydll.dll

File Type: DLL

Section contains the following exports for myDll.dll

00000000 characteristics
0 time date stamp Thu Jan 01 02:00:00 1970
0.00 version
1 ordinal base
1 number of functions
1 number of names

ordinal hint RVA name

1 0 00003834 summe

Summary

1000 .edata
1000 .idata
1000 .reloc
1000 .rsrc
1000 BSS
3000 CODE
1000 DATA
0
palva
3101 / 2233 / 450
Регистрация: 08.06.2007
Сообщений: 8,135
Записей в блоге: 4
07.04.2013, 19:46 4
Зачем вы делаете def файл для delphi и как вы его там используете? Достаточно указания об экспорте в паскалевском тексте. lib, которая (возможно) вырабатывается в delphi не подойдет для линкера Microsoft - разные стандарты. А вот для проекта на си вам нужно сделать файл def, чтобы указать что и из какой библиотеки импортируете.
1
Avazart
Эксперт С++
7735 / 5645 / 550
Регистрация: 10.12.2010
Сообщений: 25,485
Записей в блоге: 17
07.04.2013, 19:52 5
Цитата Сообщение от cuteprog Посмотреть сообщение
Как это сделать?
Код
tdump.exe Mylib.dll > log.txt
Затем открываешь log.txt и ищешь в таблице экспорта свою ф-цию ....
Но удобнее использовать PE Exploer или Dependancy Walker.
1
cuteprog
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 12
07.04.2013, 19:57  [ТС] 6
Цитата Сообщение от go Посмотреть сообщение
указать соглашение о вызове.
куда и что нужно написать?
0
Avazart
Эксперт С++
7735 / 5645 / 550
Регистрация: 10.12.2010
Сообщений: 25,485
Записей в блоге: 17
07.04.2013, 19:59 7
http://www.rsdn.ru/article/devtools/bcbdll.xml
0
palva
3101 / 2233 / 450
Регистрация: 08.06.2007
Сообщений: 8,135
Записей в блоге: 4
07.04.2013, 19:59 8
Во первых в паскалевский файл нужно написать
function summe(var a: integer):integer; stdcall; export;
или как вариант cdecl вместо stdcall.
0
cuteprog
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 12
07.04.2013, 20:01  [ТС] 9
Цитата Сообщение от palva Посмотреть сообщение
А вот для проекта на си вам нужно сделать файл def, чтобы указать что и из какой библиотеки импортируете.
Так я для этого его и создавал.

Достаточно ли следующих двух строк?
EXPORTS
summe
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
07.04.2013, 20:03 10
Цитата Сообщение от cuteprog Посмотреть сообщение
Как это сделать?
попробуйте в тотал командоре. когда сможете ее экспортировать, не забудте об
Цитата Сообщение от go Посмотреть сообщение
указать соглашение о вызове.
0
palva
3101 / 2233 / 450
Регистрация: 08.06.2007
Сообщений: 8,135
Записей в блоге: 4
07.04.2013, 20:04 11
Цитата Сообщение от cuteprog Посмотреть сообщение
Так я для этого его и создавал.
тогда мне непонятно, почему EXPORTS
0
cuteprog
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 12
07.04.2013, 20:15  [ТС] 12
Цитата Сообщение от palva Посмотреть сообщение
Во первых в паскалевский файл нужно написать
function summe(var a: integer):integer; stdcall; export;
или как вариант cdecl вместо stdcall.
Что еще нужно сделать?

Добавлено через 1 минуту
Цитата Сообщение от palva Посмотреть сообщение
тогда мне непонятно, почему EXPORTS
А как привильно?
0
palva
3101 / 2233 / 450
Регистрация: 08.06.2007
Сообщений: 8,135
Записей в блоге: 4
07.04.2013, 20:39 13
Цитата Сообщение от cuteprog Посмотреть сообщение
А как привильно?
Что-то я сам запутался. Вы создавали статическую библиотеку lib что ли?
0
cuteprog
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 12
07.04.2013, 20:56  [ТС] 14
Цитата Сообщение от palva Посмотреть сообщение
Вы создавали статическую библиотеку lib что ли?
Да. Библиотека подключается статически.
А при создании dll это как-то задается будет она статически или динамически подключаться?
0
palva
3101 / 2233 / 450
Регистрация: 08.06.2007
Сообщений: 8,135
Записей в блоге: 4
07.04.2013, 21:05 15
Нет, при создании dll это не надо задавать.
А вы запускали микрософтовскую утилиту lib.exe ?
Что-то она у меня не хочет брать dll сделанную на Delphi XE. Говорит поврежденный файл.

Добавлено через 2 минуты
Я сделал def файл запуском борландовской утилиты
Код
impdef mydll.def mydll.dll
а потом запускал bat файл с содержимым
Код
call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
lib.exe /DEF:mydll.def /OUT:mydll.lib mydll.dll
Вы тоже самое делали?

Добавлено через 2 минуты
Код
mydll.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x338
0
cuteprog
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 12
07.04.2013, 21:12  [ТС] 16
Цитата Сообщение от palva Посмотреть сообщение
А вы запускали микрософтовскую утилиту lib.exe ?
Что-то она у меня не хочет брать dll сделанную на Delphi XE. Говорит поврежденный файл.
Да:
C:\Program Files\Microsoft Visual Studio 10.0\VC>lib /def:c:\mydll.def /out:C:\mydll.lib /machine:x86

Для создания dll файла я использовал Delphi 7

Добавлено через 3 минуты
Цитата Сообщение от palva Посмотреть сообщение
Я сделал def файл запуском борландовской утилиты
Я создавал def файл в текстовом редакторе

Добавлено через 1 минуту
а потом вызывал утилиту lib.exe :
lib /def:c:\mydll.def /out:C:\mydll.lib /machine:x86
0
palva
3101 / 2233 / 450
Регистрация: 08.06.2007
Сообщений: 8,135
Записей в блоге: 4
07.04.2013, 21:13 17
Ну def-файл у нас наверно одинаковый, кроме комментария.
Код
LIBRARY     MYDLL.DLL

EXPORTS
    summe                          @1   ; summe
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,852
07.04.2013, 21:19 18
Может тебе не заморачиватся с lib если есть dll
подключай явно
C++
1
2
3
4
5
6
HMODULE hLib;
hLib = LoadLibrary("MyDll.dll");// открыли библиотеку
........................
void (*pFunction)(int, int);// прототип
(FARPROC &)pFunction = GetProcAddress(hLib, "Function"); // указатель на функцию
pFunction(0, 0); // вызов функции
вот почитай
http://www.rsdn.ru/article/baseserv/dlluse.xml
0
go
07.04.2013, 21:25
  #19

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
Может тебе не заморачиватся с lib если есть dll
Нет никакой dll. ТС сам не знает, что он хочет. Стоит открыть книжку по Delphi и почитать как создавать dll библиотеки.

0
palva
3101 / 2233 / 450
Регистрация: 08.06.2007
Сообщений: 8,135
Записей в блоге: 4
07.04.2013, 21:27 20
С подключением def файла к проекту тоже не получается. Говорит, что неразрешенная ссылка. Странно. Когда-то с Visual Studio 6 я подобную связь делал. Пробуйте тогда LoadLibrary.
0
07.04.2013, 21:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2013, 21:27

Собрать проект MSVS со всеми dll-ками
Привет! есть проектWIN32 MSVS. все работает. как собрать его таким образом,...

Не могу вызвать функцию из dll С++ в С# в системе Win 7 64bit, MSVS 2008
Здравствуйте! Уже два дня не могу вызвать функцию из dll C++ в программе,...

DLL 32 и 64 в C++ 2010
Написал простой dll, откомпилировал его в VC 2010 подключаю к матлабу, который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru