Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200

DLL 32 и 64 в C++ 2010

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

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

У меня вин7 64 бита
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.02.2013, 22:25
Ответы с готовыми решениями:

Visual C++ 2010 и Dll
Здравствуйте, нужна помощь, сам не могу разобраться. Написал dll библиотеку и хочу ее подцепить в программе с помощью функции...

Visual C++ 2010 и msvcr100.dll
В рамках эксперимента пытаюсь отправить друзьям любой простой файл, созданный как простое консольное приложение, и как конс. приложение...

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

25
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.02.2013, 22:28
в опциях проекта смени целевую машину с х86 на х64, если конечно установлен 64-х битный компилятор
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
26.02.2013, 22:34  [ТС]
не нахожу где это
вот Tools->Options

а дальше где?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.02.2013, 22:38
Цитата Сообщение от tur9 Посмотреть сообщение
вот Tools->Options
project - options/properties
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
26.02.2013, 23:05  [ТС]

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

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

Правильно?

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

Добавлено через 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.dl l"
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
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.02.2013, 17:04
во первых что бы посмотреть битность надо нажать f3 а во вторых такой вопрос - ты когда нибудь пробовал подключать динамически свою длл к своей программе?

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

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

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

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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.p... t=2&page=3
просто добавил еще одну функцию sum2num
Интересно, что подключение длл производится выставлением пути к файлу .lib, о длл ни слова


Добавлено через 3 минуты
Неясно как выполнить, добавить kernel32.lib, как сказано последней строчкой картинки
Specifiles additional items to add to the link command line [i.e. kernel32.lib]
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.02.2013, 18:31
вот смотри в архиве проект для длл и проект который динамически использует её , и ещё картинка для тотала которая показывает список функций
Вложения
Тип файла: rar Prog & DLL.rar (5.05 Мб, 16 просмотров)
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
27.02.2013, 18:44  [ТС]
сделал так: Project->Properties->VC++ Directories->Library Directories
добавил путь "C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64"
компиляция прошла, но при запуске программы вызова длл64 получаю сообщение
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.02.2013, 18:51
а вот и картинка про битность в тотале
Миниатюры
DLL 32 и 64 в C++ 2010  
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.02.2013, 18:52
tur9, dll рядом положил ?
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
27.02.2013, 20:27  [ТС]
вот-вот РЯДОМ, куда рядом? раньше клал, а теперь голова кругом
не рядом сейчас, а добавил путь 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\Debu g.obj'
интересно, что такого файла Debug.obj у меня вообще нет нигде

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

откуда он?

Добавлено через 8 минут
не понял как вызывать битность в тотале, F3 дает результат, который я показал в сообщении 8 на предыдущей странице. Может у меня не тот тотал? Да, не тот, сейчас тот установлю
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.02.2013, 21:43
Цитата Сообщение от tur9 Посмотреть сообщение
а мой код длл ты не смог бы откомпилировать? Извини за нахальство, тернистый путь
кидай посмотрим
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
27.02.2013, 22:23  [ТС]
По умолчанию автоматом создается этот файл
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 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 файл
Code
1
2
3
4
// targ1.h
void LetterList();
int PutInt(int);
int sum2num(int, int);
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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; 
}
вызов длл-я
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 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;
}
Так я и не смог пока понять как ты получил картинку файла где битность видна в тотале.
Если не сложно объясни.
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.02.2013, 22:32
Цитата Сообщение от tur9 Посмотреть сообщение
Так я и не смог пока понять как ты получил картинку файла где битность видна в тотале.
поставь ту версию тотала какая и у меня , найди свою длл и нажми f3, а по поводу кода - подожди чуть , сейчас гляну

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

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

Добавлено через 1 минуту
ушёл на пол часа , приду посмотрю , а ты пока подумай над тем что я тебе сказал
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
27.02.2013, 22:34
еще есть альтернатива для подключения своего функционала и вроде даже более правильная:
мех-файлы. от необходимости правильной сборки она не избавляет, но может быть полезна:
http://ru.wikipedia.org/wiki/M... 0.BB.D1.8B
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
27.02.2013, 23:06  [ТС]
DU, спасибо за ссылку, правда маловато там чтобы понять.
Проблема у меня такая: программа на матлабе когда доходит до определенной функции поиска контуров на картинке, на матрице делает это медленно. Единственное решение я вижу вызвать тот же алгоритм, написанный на чем то быстром, на си например. Мне все равно dll или mex файлы. Я готов разбираться и с тем и с другим. Единственная моя проблема в том, чтобы понять как это делать. Ты знаешь как делать mex-файлы?

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

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

- поставь ту версию тотала какая и у меня , найди свою длл и нажми f3
так я поставил такую же как и у тебя версию 756а, но интерфейс совсем другой, как и у меня в восьмой версии. Не понимаю там как битность увидеть
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.02.2013, 23:12
Цитата Сообщение от tur9 Посмотреть сообщение
мне все равно в чем делать, скажешь в си - буду в си. Просто я пример нашел такой, вот и сделал.
я тебе говорю , что пиши программу на с++, но экспорт функций делай на С.
Цитата Сообщение от tur9 Посмотреть сообщение
разве к матлабу можно статически? может mex-файлы это и есть статический способ подключения? я предполагал в начале подключать динамически, т.е. чтобы потом вызывать через loadlibrary. мне все равно как подключать лишь бы программа работала в конце.
к матлабу наврят ли можно статически , а вот в твоей программе которая вызывает функции из длл , ты именно статически подключаеш.
Сейчас посмотрю твой текст,далеко не убегай
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2013, 23:12
Помогаю со студенческими работами здесь

Bass.dll в CodeGear 2010
Народ подскажите как подключить bass к codegear 2010... что куда надо копировать и где что прописывать? Если сможете напишите пошагово.

libmysql.dll и Delphi 2010
Помогите пожалуйста!!! Подключаюсь к базе mysql 5.0 через delphi 2010 при помощи компонентов dbExpress. Но при попытке подключится вылетает...

Подключение .dll в Visual Studio 2010
Не могу справиться со студией. Не могли бы Вы подробно, пошагово написать когда и как подключить библиотеку данных к программе. Пробовал,...

Msvcr71.dll и Microsoft Visual C++ 2010
Собственно проблема в следующем: Шеф дал исходники какого-то старого проекта. Поставил задачу, собрать запустить и разобраться что там к...

Создание DLL на Visual Studio 2010-12
Если есть у кого видео как создать dll на 10 или 12 студии под c++ буду благодарен если поделитесь.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru