Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Октябрь 24, 2024, 22:31



Название: Проблема с подключением DLL на VS и QtCreator
Отправлено: demaker от Октябрь 24, 2024, 22:31
Доброго времени суток!

Имеется библиотека созданная в VS2022

Типа:

example.h

Код:
#pragma once

#ifdef EXAMPLE_EXPORTS
#define EXAMPLE_API __declspec(dllexport)
#else
#define EXAMPLE_API __declspec(dllimport)
#endif

EXAMPLE_API void Get_Example();

example.cpp

Код:

#include "pch.h"
#include "example.h"
#include <iostream>


void Get_Example()
{
     std::cout << "hello example\n";
}



Если я подключаю данную библиотеку к проекту на VS то все хорошо и работает.

Если же к проекту на Qt (правда это на другой машине и там нету VS) то не работает выдается ошибка
Код:
undefined reference to  -Z..Get_Example..


В pro-файле указываю путь к .h и .lib - файлам
Код:
INCLUDEPATH += "C:\path"
LIBS += "C:\path\name.lib"



Но если в хедере библиотеки сделать

Код:

...

extern "C"{
     EXAMPLE_API void Get_Example();
}


пересобрать и подключить к Qt проекту то все норм.

Пытался сделать в .pro файле Qt проекта добавить дефайн

Код:
DEFINES += EXAMPLE_EXPORTS

Но безуспешно(

Кто-нибудь сталкивался с такой проблемой? Подскажите в чем может быть причина?



Название: Re: Проблема с подключением DLL на VS и QtCreator
Отправлено: kambala от Октябрь 24, 2024, 23:41
Цитировать
правда это на другой машине и там нету VS
ну если там используется не тот же компилятор (msvc toolset), которым ты собрал библиотеку, то чему ты удивляешься. Видимо, мы должны сами угадать какой у тебя компилятор используется на другой машине.


Название: Re: Проблема с подключением DLL на VS и QtCreator
Отправлено: demaker от Октябрь 25, 2024, 09:48
Цитировать
правда это на другой машине и там нету VS
ну если там используется не тот же компилятор (msvc toolset), которым ты собрал библиотеку, то чему ты удивляешься. Видимо, мы должны сами угадать какой у тебя компилятор используется на другой машине.

Извините что сразу не уточнил ;D

Да в студии используется стандартный компилятор(msvc toolset), а в Qt MinGW32bit

Т.е получается, что библа используемая в проекте должна быть собрана тем же компилятором что и сам проект иначе никак.
Я правильно понимаю?  Может можно как-то настроить?


Название: Re: Проблема с подключением DLL на VS и QtCreator
Отправлено: ssoft от Октябрь 25, 2024, 15:21
Извините что сразу не уточнил ;D

Да в студии используется стандартный компилятор(msvc toolset), а в Qt MinGW32bit

Т.е получается, что библа используемая в проекте должна быть собрана тем же компилятором что и сам проект иначе никак.
Я правильно понимаю?  Может можно как-то настроить?

В C++ нет стандарта по экспорту методов при сборке библиотек, поэтому библиотеки совместимы только тогда, когда собраны одним и тем же компилятором.

Такой стандарт есть в C, но тогда в C++ коде глобальные методы (для других нельзя) нужно задекларировать как

Код
C++ (Qt)
// MyCFuncs.h
#ifdef __cplusplus
extern "C" {  // only need to export C interface if
             // used by C++ source code
#endif
 
__declspec( dllimport ) void MyCFunc();
__declspec( dllimport ) void AnotherCFunc();
 
#ifdef __cplusplus
}
#endif
 

Далее небольшой геморрой с подготовкой файлов для другого компилятора

Инструментами из состава MinGW для библиотеки требуется выполнить

  • Запустить gendef example.dll(сгенерирует example.def)
  • Запустить dlltool -D example.dll -d example.def -l libexample.a(сгенерирует libexample.a)
  • Использовать libexample.a вместе с example.dll для линковки с проектом на MinGW

И главное не напутать с битностью библиотеки, так как инструменты не выдают никаких ошибок).

Такой подход следует использовать только тогда, когда нет исходных файлов example и он поставляется исключительно в виде готовой библиотеки, в противном случае это просто садомазохизм.


Название: Re: Проблема с подключением DLL на VS и QtCreator
Отправлено: kambala от Октябрь 25, 2024, 23:24
Да в студии используется стандартный компилятор(msvc toolset), а в Qt MinGW32bit
господи, какая же у тебя каша в голове... Нет никакого «стандартного компилятора», есть вполне конкретная версия msvc toolset, ее можно увидеть через установщик студии.
Т.е получается, что библа используемая в проекте должна быть собрана тем же компилятором что и сам проект иначе никак.
Я правильно понимаю?  Может можно как-то настроить?
да, правильно. Не понял что ты хочешь настроить.