Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

У меня вин7 64 бита
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 22:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос DLL 32 и 64 в C++ 2010 (C++):

Подключение dll в MSVS 2010 C++ - C++
Код: __declspec(dllimport) int summe(int a); void main(){ summe(3); } При компиляции выдает следующую ошибку: error LNK2019:...

Создание .dll в MSVC 2010 в чем ошибка? - C++
Проблема в чем.. есть dll с тремя функциями... Скомпилировал и пытался подключить на другом ноуте к проекту... Но не известно по какой...

Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) - C++
Здравствуйте! Есть такая ситуация: в приложении происходит вызов функции из библиотеки, в которую надо передать vector<wchar_t*>*. Когда...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

Точка входа в процедуру InterlockedCompareExchange64 не найдена в библиотеке DLL KERNEL32.DLL - C++
День добрый! При запуске моей программы (много моего кода + много разных сторонних dll) на WinXP SP2, получаем соответствующую ошибку...

Добавление своей dll в список dll подгружаемых процессом чужого процесса - C++
Вообще вопрос такой,как можно внедрить свою dll в список Import чужого не запущенного процесса?Не изменяя структуры файла.

25
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.02.2013, 22:28 #2
в опциях проекта смени целевую машину с х86 на х64, если конечно установлен 64-х битный компилятор
0
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
26.02.2013, 22:34  [ТС] #3
не нахожу где это
вот Tools->Options

а дальше где?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.02.2013, 22:38 #4
Цитата Сообщение от tur9 Посмотреть сообщение
вот Tools->Options
project - options/properties
0
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
26.02.2013, 23:05  [ТС] #5

Не понимаю где именно надо менять 32 на 64, где и что конкретно менять или выбирать
0
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
26.02.2013, 23:58 #6
tur9, вам до этого ещё ранова то будет , имхо конечно . Смотри - Active Solution Platform

Добавлено через 2 минуты
а какие подводные камни ещё могут всплыть на 64 битной программе (DLL) вы себе даже не представляете !
0
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 16:21  [ТС] #7
Вот сделал

Правильно?

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

Добавлено через 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


А вот длл (в тотале и эксплорере, разницы нет)




Добавлено через 5 минут
А это при 32 компиляции


Добавлено через 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.срр' нет
0
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 17:04 #8
во первых что бы посмотреть битность надо нажать f3 а во вторых такой вопрос - ты когда нибудь пробовал подключать динамически свою длл к своей программе?

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

видно, что файлы разные, но где внутри видна битность?

вот 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, о длл ни слова


Добавлено через 3 минуты
Неясно как выполнить, добавить kernel32.lib, как сказано последней строчкой картинки
Specifiles additional items to add to the link command line [i.e. kernel32.lib]
0
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 18:31 #10
вот смотри в архиве проект для длл и проект который динамически использует её , и ещё картинка для тотала которая показывает список функций
0
Вложения
Тип файла: rar Prog & DLL.rar (5.05 Мб, 15 просмотров)
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 18:44  [ТС] #11
сделал так: Project->Properties->VC++ Directories->Library Directories
добавил путь "C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64"
компиляция прошла, но при запуске программы вызова длл64 получаю сообщение
0
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 18:51 #12
а вот и картинка про битность в тотале
0
Миниатюры
DLL 32 и 64 в C++ 2010  
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 18:52 #13
tur9, dll рядом положил ?
0
tur9
43 / 4 / 1
Регистрация: 20.08.2012
Сообщений: 89
27.02.2013, 20:27  [ТС] #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 на предыдущей странице. Может у меня не тот тотал? Да, не тот, сейчас тот установлю
0
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
27.02.2013, 21:43 #15
Цитата Сообщение от tur9 Посмотреть сообщение
а мой код длл ты не смог бы откомпилировать? Извини за нахальство, тернистый путь
кидай посмотрим
0
27.02.2013, 21:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2013, 21:43
Привет! Вот еще темы с ответами:

Как узнать путь к загруженной DLL из самой DLL? - C++
Создаю небольшую программку в папке c:/test/app/, есть DLL в папке c:/test/dll/. В коде самой dll, после её подгрузки в программу, можно...

Dll файл в exe файле. Вшить dll libcurl - C++
Проблема такая что приходится таскать всегда libcurl.dll с собой. Надо все носить в одном exe. Enigma Virtual Box использовать нельзя,...

Запись из внедренной dll в другую dll этого процесса - C++
main.cpp #include &lt;Windows.h&gt; extern int writeprocess(); DWORD WINAPI MainThread(LPVOID lpParam) { ...

Windows I/o без Kernel32.dll и Advapi32.dll - C++
Добрый день. Необходимо в Windows XP SP3 распечатать в стандартный поток &quot;some text here&quot; без прямого или косвенного использования...


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

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

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