Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
#1

DLL 32 и 64 в C++ 2010 - C++

26.02.2013, 22:25. Просмотров 1600. Ответов 25
Метки нет (Все метки)

Написал простой dll, откомпилировал его в VC 2010 подключаю к матлабу, который ругается что dll создан 32 битным компилятором, а нужен 64 битный. Подскажите пожалуйста как в VC 2010 откомпилировать 64 битным компилятором? Какие нужны настройки?

У меня вин7 64 бита
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.02.2013, 22:28     DLL 32 и 64 в C++ 2010 #2
в опциях проекта смени целевую машину с х86 на х64, если конечно установлен 64-х битный компилятор
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
26.02.2013, 22:34  [ТС]     DLL 32 и 64 в C++ 2010 #3
не нахожу где это
вот Tools->Options
[IMG]http://i031.***********/1302/63/f4f3a9f3b8ba.png[/IMG]
а дальше где?
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.02.2013, 22:38     DLL 32 и 64 в C++ 2010 #4
Цитата Сообщение от tur9 Посмотреть сообщение
вот Tools->Options
project - options/properties
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
26.02.2013, 23:05  [ТС]     DLL 32 и 64 в C++ 2010 #5
[IMG]http://s002.***********/i197/1302/bf/263915c2538c.png[/IMG]
Не понимаю где именно надо менять 32 на 64, где и что конкретно менять или выбирать
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
26.02.2013, 23:58     DLL 32 и 64 в C++ 2010 #6
tur9, вам до этого ещё ранова то будет , имхо конечно . Смотри - Active Solution Platform

Добавлено через 2 минуты
а какие подводные камни ещё могут всплыть на 64 битной программе (DLL) вы себе даже не представляете !
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 16:21  [ТС]     DLL 32 и 64 в C++ 2010 #7
Вот сделал
[IMG]http://s005.***********/i209/1302/8e/3d697efb3e25.png[/IMG]
Правильно?

Игорь с++, вы меня просто убиваете, даже не знаю как теперь быть. У меня программа на матлабе некоторые функции долго выполняет, мне как воздух длли нужны и что теперь делать? Можете помогать мне на каких-нибудь условиях?

Добавлено через 41 минуту
уже первые ласточки: компиляция не проходит: error lnk1104 cannot open file 'kernel32.lib'
Нашел вот этот либ "C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64\Kernel32.Lib"
куда его надо подключить или скопировать? пока все мои попытки безуспешны

Добавлено через 12 часов 26 минут
Удалось скомпилировать и получить длл 64. Положил в одну папку полученные длл, либ и h. Перешел в матлабе в эту папку, вызываю loadlibrary('targ1','targ1.h') и получаю ошибку

Error using loadlibrary (line 419)
There was an error loading the library "D:\Prog\C\Console\DLL\LIBS\targ1.dll"
D:\Prog\C\Console\DLL\LIBS\targ1.dll is not a valid Win32 application.

Что это все значит? Что новый dll все еще 32, а не 64?

Интересно, что lib 32 по размеру неотличим от 64, а dll 64 чуть-чуть больше чем dll 32

Добавлено через 1 час 37 минут
Вот исходник с указанием платформы х64
[IMG]http://i076.***********/1302/56/7b4119c6f04e.png[/IMG]

А вот длл (в тотале и эксплорере, разницы нет)
[IMG]http://s019.***********/i631/1302/4d/be8c68747414.png[/IMG]

[IMG]http://s002.***********/i197/1302/5f/19bbcf55e467.png[/IMG]

Добавлено через 5 минут
А это при 32 компиляции
[IMG]http://s44.***********/i103/1302/f6/7ed0f59e040c.png[/IMG]

Добавлено через 14 минут
ошибся, длл и либ брал не оттуда. Надо отсюда брать D:\Prog\C\Console\DLL\soltarg1\x64\Debug\

1>------ Rebuild All started: Project: targ1, Configuration: Debug x64 ------
1> stdafx.cpp
1> dllmain.cpp
1> targ1.cpp
1> Creating library D:\Prog\C\Console\DLL\soltarg1\x64\Debug\targ1.lib and object D:\Prog\C\Console\DLL\soltarg1\x64\Debug\targ1.exp
1> targ1.vcxproj -> D:\Prog\C\Console\DLL\soltarg1\x64\Debug\targ1.dll
1> Creating library D:\Prog\C\Console\DLL\soltarg1\x64\Debug\targ1.lib and object D:\Prog\C\Console\DLL\soltarg1\x64\Debug\targ1.exp
1> targ1.vcxproj -> D:\Prog\C\Console\DLL\soltarg1\x64\Debug\targ1.dll
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

Добавлено через 39 минут
После вызова из матлаба правильных 64 битных длл получил другую ошибку

loadlibrary('targ1','targ1.h')
Warning: The function 'LetterList' was not found in the library
> In loadlibrary at 403
Warning: The function 'PutInt' was not found in the library
> In loadlibrary at 403
Warning: The function 'sum2num' was not found in the library
> In loadlibrary at 403

Странно, имена функций из 'targ1.h' видит, реализации функций в 'targ1.срр' нет
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 17:04     DLL 32 и 64 в C++ 2010 #8
во первых что бы посмотреть битность надо нажать f3 а во вторых такой вопрос - ты когда нибудь пробовал подключать динамически свою длл к своей программе?

Добавлено через 3 минуты
так же советую тебе через тотал командер посмотреть список импортируемых функций ,100% она называется не так как ты писал
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 18:11  [ТС]     DLL 32 и 64 в C++ 2010 #9
вот F3 слева при фокусе на левом targ1.dll (32 бита), справа - на правом targ1.dll (64 бита)
[IMG]http://i060.***********/1302/7c/eafa030097ad.png[/IMG]
видно, что файлы разные, но где внутри видна битность?

вот F3 на файл targ1.h
Код
void LetterList();
int PutInt(int);
int sum2num(int, int);
Подключать этот длл к С++ 2010 пробовал, но в режиме 32. Все работало. Сейчас попробовал в 64 и соответственно при вызове длл64, выдается ошибка LINK : fatal error LNK1104: cannot open file 'kernel32.lib'

Вот код вызова

Код
// call_dll_1_console.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "targ1.h"
#include <iostream>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int x = PutInt(5);
	LetterList();
	int a(3), b(7), y;
	y = sum2num(a, b);
	std::cout<<x<<'\n';
	std::cout<<y;
	_getch();
	return 0;
}
Добавлено через 19 минут
Поставил в программу вызова вместо вызываемого длл32 и либ32, соответственно длл64 и либ64, но тип компиляции оставил вин32, получил ожидаемую ошибку

targ1.lib(targ1.dll) : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'
это тот редкий случай когда ошибка радует

но при смене режима компиляции на х64 получаю все ту же ошибку
>LINK : fatal error LNK1104: cannot open file 'kernel32.lib'

Добавлено через 9 минут
длл я писал как сказано здесь http://life-prog.ru/view_zam.php?id=189&cat=2&page=3
просто добавил еще одну функцию sum2num
Интересно, что подключение длл производится выставлением пути к файлу .lib, о длл ни слова
[IMG]http://s019.***********/i602/1302/de/3bffe6ec883d.png[/IMG]

Добавлено через 3 минуты
Неясно как выполнить, добавить kernel32.lib, как сказано последней строчкой картинки
Specifiles additional items to add to the link command line [i.e. kernel32.lib]
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 18:31     DLL 32 и 64 в C++ 2010 #10
вот смотри в архиве проект для длл и проект который динамически использует её , и ещё картинка для тотала которая показывает список функций
Вложения
Тип файла: rar Prog & DLL.rar (5.05 Мб, 15 просмотров)
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 18:44  [ТС]     DLL 32 и 64 в C++ 2010 #11
сделал так: Project->Properties->VC++ Directories->Library Directories
добавил путь "C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64"
компиляция прошла, но при запуске программы вызова длл64 получаю сообщение
[IMG]http://s001.***********/i196/1302/8f/89510739512c.png[/IMG]
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 18:51     DLL 32 и 64 в C++ 2010 #12
а вот и картинка про битность в тотале
Миниатюры
DLL 32 и 64 в C++ 2010  
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 18:52     DLL 32 и 64 в C++ 2010 #13
tur9, dll рядом положил ?
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 20:27  [ТС]     DLL 32 и 64 в C++ 2010 #14
вот-вот РЯДОМ, куда рядом? раньше клал, а теперь голова кругом
не рядом сейчас, а добавил путь Linker->Input->Additional Dependencies D:\Prog\C\Console\DLL\soltarg1\x64\Debug
наверное здесь проблема, надо взять длл и либ из проекта по созданию длл и положить его в папку проекта вызова длл, но куда там именно его, их положить?

твое все заработало когда добавил

Project->Properties->VC++ Directories->Library Directories
добавил путь "C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64"

еще там буду разбираться почему заработало
а мой код длл ты не смог бы откомпилировать? Извини за нахальство, тернистый путь

Добавлено через 2 минуты
сейчас при вызове моего длл такая ошибка
1>LINK : fatal error LNK1104: cannot open file 'D:\Prog\C\Console\DLL\soltarg1\x64\Debug.obj'
интересно, что такого файла Debug.obj у меня вообще нет нигде

Добавлено через 23 минуты
Твоя программа производит длл этот
Prog & DLL\MyDll\x64\Release\MyDll.dll
размером 116736 байт, а при вызове длл вызывается другой длл с тем же именем
Prog & DLL\Prog\x64\Release\MyDll.dll
размером 119808 байт

откуда он?

Добавлено через 8 минут
не понял как вызывать битность в тотале, F3 дает результат, который я показал в сообщении 8 на предыдущей странице. Может у меня не тот тотал? Да, не тот, сейчас тот установлю
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 21:43     DLL 32 и 64 в C++ 2010 #15
Цитата Сообщение от tur9 Посмотреть сообщение
а мой код длл ты не смог бы откомпилировать? Извини за нахальство, тернистый путь
кидай посмотрим
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 22:23  [ТС]     DLL 32 и 64 в C++ 2010 #16
По умолчанию автоматом создается этот файл
Код
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}
Мой h файл
Код
// targ1.h
void LetterList();
int PutInt(int);
int sum2num(int, int);
Код
// targ1.cpp : Defines the exported functions for the DLL application.

#include "stdafx.h"
#include <iostream>

extern "C++"__declspec(dllexport) void LetterList()
{ 
	std::cout << "This function was called from LetterList() " << std::endl; 
} 

extern "C++" __declspec(dllexport) int PutInt(int param) 
{ 
	return param; 
}

extern "C++" __declspec(dllexport) int sum2num(int num1, int num2) 
{ 
	return num1 + num2; 
}
вызов длл-я
Код
// call_dll_1_console.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include "targ1.h"
#include <iostream>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int x = PutInt(5);
	LetterList();
	int a(3), b(7), y;
	y = sum2num(a, b);
	std::cout<<x;
	std::cout<<y;
	_getch();
	return 0;
}
Так я и не смог пока понять как ты получил картинку файла где битность видна в тотале.
Если не сложно объясни.
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 22:32     DLL 32 и 64 в C++ 2010 #17
Цитата Сообщение от tur9 Посмотреть сообщение
Так я и не смог пока понять как ты получил картинку файла где битность видна в тотале.
поставь ту версию тотала какая и у меня , найди свою длл и нажми f3, а по поводу кода - подожди чуть , сейчас гляну

Добавлено через 1 минуту
да и ещё ты её статичечки или динамически хочеш подключать ? Просто по коду это больше похоже на статическую

Добавлено через 2 минуты
Цитата Сообщение от tur9 Посмотреть сообщение
extern "C++" __declspec(dllexport) int sum2num(int num1, int num2)
ЧТО ЭТО ТАКОЕ ? Ты экспортируеш длл в стиле с++ ? Зачем ? Там же имена будут искажены , экспорт делай в стиле "С"

Добавлено через 1 минуту
ушёл на пол часа , приду посмотрю , а ты пока подумай над тем что я тебе сказал
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.02.2013, 22:34     DLL 32 и 64 в C++ 2010 #18
еще есть альтернатива для подключения своего функционала и вроде даже более правильная:
мех-файлы. от необходимости правильной сборки она не избавляет, но может быть полезна:
http://ru.wikipedia.org/wiki/MATLAB#...B9.D0.BB.D1.8B
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 23:06  [ТС]     DLL 32 и 64 в C++ 2010 #19
DU, спасибо за ссылку, правда маловато там чтобы понять.
Проблема у меня такая: программа на матлабе когда доходит до определенной функции поиска контуров на картинке, на матрице делает это медленно. Единственное решение я вижу вызвать тот же алгоритм, написанный на чем то быстром, на си например. Мне все равно dll или mex файлы. Я готов разбираться и с тем и с другим. Единственная моя проблема в том, чтобы понять как это делать. Ты знаешь как делать mex-файлы?

- ЧТО ЭТО ТАКОЕ ? Ты экспортируеш длл в стиле с++ ? Зачем ? Там же имена будут искажены , экспорт делай в стиле "С"
мне все равно в чем делать, скажешь в си - буду в си. Просто я пример нашел такой, вот и сделал.

-да и ещё ты её статичечки или динамически хочеш подключать ?
разве к матлабу можно статически? может mex-файлы это и есть статический способ подключения? я предполагал в начале подключать динамически, т.е. чтобы потом вызывать через loadlibrary. мне все равно как подключать лишь бы программа работала в конце.

- поставь ту версию тотала какая и у меня , найди свою длл и нажми f3
так я поставил такую же как и у тебя версию 756а, но интерфейс совсем другой, как и у меня в восьмой версии. Не понимаю там как битность увидеть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2013, 23:12     DLL 32 и 64 в C++ 2010
Еще ссылки по теме:
C++ Как подключить dll на C# к проекту (dll) на С++
C++ Вызов dll из dll -> request example
Подгрузка dll через dll C++
C++ Вызов dll ресурсов в dll
C++ Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll

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

Или воспользуйтесь поиском по форуму:
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 23:12     DLL 32 и 64 в C++ 2010 #20
Цитата Сообщение от tur9 Посмотреть сообщение
мне все равно в чем делать, скажешь в си - буду в си. Просто я пример нашел такой, вот и сделал.
я тебе говорю , что пиши программу на с++, но экспорт функций делай на С.
Цитата Сообщение от tur9 Посмотреть сообщение
разве к матлабу можно статически? может mex-файлы это и есть статический способ подключения? я предполагал в начале подключать динамически, т.е. чтобы потом вызывать через loadlibrary. мне все равно как подключать лишь бы программа работала в конце.
к матлабу наврят ли можно статически , а вот в твоей программе которая вызывает функции из длл , ты именно статически подключаеш.
Сейчас посмотрю твой текст,далеко не убегай
Yandex
Объявления
27.02.2013, 23:12     DLL 32 и 64 в C++ 2010
Ответ Создать тему
Опции темы

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