|
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
|
||||||||||||||||||||||||||
Использование Dll написанной в VC++ в программе компилируемой MinGW04.06.2013, 15:26. Показов 7912. Ответов 16
Метки нет (Все метки)
Добрый день!
Возникла следующая проблема. Из-за некоторой специфики задачи (работа с DirectShow) необходимо написать модуль (dll) в MSVC и подцепить его к проекту на Qt (компилляция средствами MinGW) Делаю для теста два простых проекта, без Qt Проект Dll в MSVC: dll.h
dll.cpp
И делаю проект в Qt (используется только qmake и MinGw) dlltest.pro
main.cpp
Библиотека собирается, но при сборке тестовой программы вываливается сообщение undefined reference to `_imp___Z5fndllv' Я уже всякие методы перепробовал, и reimp использовал, и dlltool для преобразования .lib файл-то библиотеки находит, а функцию не видит сборка выполняется следующей командой:
Может быть MS-компиллятор и MinGW по разному формируют имя функций для записи/чтения из dll ? Подскажите что делать, куда копать? Добавлено через 44 минуты Уважаемый Модератор, мне кажется я ошибся с разделом и тему лучше переместить в "С++ для экспертов"
0
|
||||||||||||||||||||||||||
| 04.06.2013, 15:26 | |
|
Ответы с готовыми решениями:
16
Использование чужой dll в своей программе
Вызов программой, написанной на С++, функции из dll, написанной на Assembler (явное подключение dll) |
|
Ушел с форума
|
|
| 04.06.2013, 16:29 | |
|
Единственный стопроцентно переносимый между различными компиляторами
способ dll-экспорта в Win32 - это экспорт stdcall-функций с помощью def-файла. Так сделан экспорт стандартных dll-ок Windows. Все остальное - это compiler-specific, переносимость не гарантируется. Одни компиляторы (например, Visual C++ и Intel C++ Compiler) хорошо совместимы друг с другом, другие нет. По теме: очень советую найти и прочесть книгу "C++. Практический подход к решению проблем программирования" (М. Уилсон, английское название - "Imperfect C++"). Там есть глава "выживание в условиях реального мира", посвященная таким вот проблемам.
2
|
|
|
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
|
|||||||||||
| 04.06.2013, 16:42 [ТС] | |||||||||||
|
что-то все равно не понимаю
Уже совсем упростил Объявляю функцию так:
0
|
|||||||||||
|
Ушел с форума
|
|
| 04.06.2013, 16:47 | |
|
Visual C++ экспортирует функцию с такой сигнатурой, как "_fndll@0".
А MinGW "хочет" "fndll@0". Разница в ведущем подчеркивании. Попробуйте сделать экспорт через def-файл (объявление функции не меняйте).
0
|
|
|
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
|
||||||
| 04.06.2013, 17:06 [ТС] | ||||||
|
В настройках студии есть где-то пункт позволяющий создавать def-файлы?
Пробовал командой
Эх, завтра на свежую голову буду разбираться Спасибо
0
|
||||||
|
Ушел с форума
|
||||||
| 04.06.2013, 17:49 | ||||||
|
Просто добавьте "Module Definition File (def)" в проект.
А в нем объявите экспорты:
0
|
||||||
|
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
|
|
| 04.06.2013, 18:17 | |
|
1
|
|
|
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
|
|
| 05.06.2013, 10:15 [ТС] | |
|
Все равно ни в какую
Пробовал сделать преобразование согласно инструкции http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs Скачал и gendef и pexports и reimp Пробовал в разных комбинациях, а все равно ошибку пишет gendef по dll генерирует вот такой def (команда <pexports msvc.dll | sed "s/^_//" > msvc.def> дает такой же результат, за исключением первой строки, имя библиотеки без кавычек) LIBRARY "msvc.dll" EXPORTS ??0Cmsvc@@QAE@XZ ??4Cmsvc@@QAEAAV0@ABV0@@Z ; has WINAPI (@4) ?fnmsvc@@YAHXZ ?nmsvc@@3HA DATA при помощи программы dlltool из def и dll получается lib Но не видит MinGW функций и все. Я уже и __stdcall и export "C" использовал, но результат один Что я делаю не так и вообще возможно ли осуществить затею?
0
|
|
|
Ушел с форума
|
||
| 05.06.2013, 10:33 | ||
|
Каждый компилятор волен искажать экспортируемые имена так, как ему вздумается. И, соответственно, при импорте из dll он также будет ожидать совсем других имен, нежели генерируются остальными компиляторами. Даже если два разных компилятора имеют совместимый формат, это еще ни о чем не говорит. Они могут использовать разные версии STL/Runtime, разные аллокаторы памяти и еще много всего разного. Даже в пределах одной линейки компилятора возможны проблемы, если используются разные его версии. Поэтому про экспорт классов из dll забудьте, эта идея непереносимая. Переносимо можно экспортировать из dll только функции, и только через def-файл, так как это "родной" способ для Win32 подключения системных dll-библиотек, и все Windows-совместимые компиляторы обязаны его поддерживать.
0
|
||
|
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
|
|||||||||||
| 05.06.2013, 15:32 [ТС] | |||||||||||
|
В ходе плясок с бубном была выявлена рабочая комбинация
В студии создаю Win32 Dll и в настройках проекта указываю путь такой, чтобы готовые .dll и .lib оказались рядом с .exe который создается MinGW определяю функцию следующим образом: dll.h
dll.cpp
В проекте .pro добавляю INCLUDEPATH чтобы подключить dll.h и LIBS += debug/dll.lib В main.cpp указываю хэдер и вызываю нужную функцию. Я уж было отчаялся и решил использовать явную загрузку dll при помощи класса QLibrary, и в хэлпе к нему наткнулся на то, как следует объявлять функцию, в случае импорта кусок __declspec(dllimport) не просто так закоменчен, когда он есть, то не работает связка. Спасибо откликнувшимся за помощь! Я правда так и не понял тонкостей декорирования имен функций в разных случаях, но хоть дело вперед сдвинулось.
0
|
|||||||||||
|
1 / 1 / 1
Регистрация: 02.08.2015
Сообщений: 15
|
|
| 02.08.2015, 03:24 | |
|
Зарегестрировался для чтобы чтобы отписаться в этой теме.
Надеюсь что некропостинг не нарушает правила ![]() Столкнулся с аналогичной задачей : тружусь над модификацией для игры, движок собран в MSVC, библиотеку модификации пытаюсь сделать при помощи mingw (игра сбрана достаточно старой версией MSVC в которой нет возможности использовать более новые оптимизации). Бибилиотека модификации использует boot_python в качестве интерфейса python-c++. Суть проблемы в том что в boost_python имена функций такого типа : ?get_class_object@registration@converter @python@boost@@QBEPAU_typeobject@@XZ а gcc ожидает : _ZNK5boost6python9converter12registratio n16get_class_objectEv У меня есть два варианта либо что-либо менять в самом dll модификации, либо же в boost_python. Есть ли какой то вариант заставить функцию иметь два экспорта, аля алиас ? Будет ли оно в таком формате адекватно работать? И как это сделать? Я вижу самым логичным залесть в исходники boost_python и каким то образом добавить выше указанные алиасы, дабы удовлетворить и движок и мою DLL собранную GCC.
0
|
|
|
Ушел с форума
|
||||||
| 02.08.2015, 10:40 | ||||||
|
Dll может иметь два и более экспорта на одну и ту же функцию.
Например (DEF-файл):
Во втором случае (строка 4) в экспорте будет имя abcde?xyz_123. Но в данном случае это все не имеет большого смысла. Дело в том, что интерфейсы C++ не портируются, как правило, на другие компиляторы, т.е. они не совместимы на двоичном уровне (нет ABI - Application Binary Interface). Поэтому, если только речь не идет о простой функции, возвращающей какой-нибудь int, работать это, скорее всего, не будет.
0
|
||||||
|
1 / 1 / 1
Регистрация: 02.08.2015
Сообщений: 15
|
|
| 02.08.2015, 13:32 | |
|
Есть ли какое то решение для такой проблемы?
Возможно прокси-библиотека? Также все же возвращаясь к изначальной идее - Если к существующему набору экспортов я добавлю набор экспортов второго компилятора будет шанс что заработает?
0
|
|
|
Ушел с форума
|
|
| 02.08.2015, 15:44 | |
|
Решение таких проблем - это, как правило, либо C-шный интерфейс с
известными типами фиксированного размера и известного выравнивания, либо использование технологии COM. Ну есть еще совместимые между собой компиляторы, например MS C++ и Intel C++.
0
|
|
|
1 / 1 / 1
Регистрация: 02.08.2015
Сообщений: 15
|
|
| 03.08.2015, 00:58 | |
|
Таким образом, не имея доступа к движку игры и имея дело с С++ у меня остается два варианта :
Либо создание прокси (который будет собран в MSVC) \ COM модуля. Либо переписывание всех внешних функций на чистый Си. Верно ли я понимаю?
0
|
|
|
Ушел с форума
|
|
| 03.08.2015, 08:59 | |
|
Да. Может быть, есть еще какие-то способы, но это то, что лежит на
поверхности и точно будет работать, если правильно все сделать.
0
|
|
| 03.08.2015, 08:59 | |
|
Помогаю со студенческими работами здесь
17
Использование DLL, написанной на C++, в C# (указатели)
Использование dll, написанной на C++ Qt в Delphi
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|