Russian Qt Forum
Ноябрь 22, 2024, 19:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с подключением DLL на VS и QtCreator  (Прочитано 1913 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Октябрь 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

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

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

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Октябрь 24, 2024, 23:41 »

Цитировать
правда это на другой машине и там нету VS
ну если там используется не тот же компилятор (msvc toolset), которым ты собрал библиотеку, то чему ты удивляешься. Видимо, мы должны сами угадать какой у тебя компилятор используется на другой машине.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Октябрь 25, 2024, 09:48 »

Цитировать
правда это на другой машине и там нету VS
ну если там используется не тот же компилятор (msvc toolset), которым ты собрал библиотеку, то чему ты удивляешься. Видимо, мы должны сами угадать какой у тебя компилятор используется на другой машине.

Извините что сразу не уточнил Смеющийся

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

Т.е получается, что библа используемая в проекте должна быть собрана тем же компилятором что и сам проект иначе никак.
Я правильно понимаю?  Может можно как-то настроить?
« Последнее редактирование: Октябрь 25, 2024, 09:51 от demaker » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #3 : Октябрь 25, 2024, 15:21 »

Извините что сразу не уточнил Смеющийся

Да в студии используется стандартный компилятор(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 и он поставляется исключительно в виде готовой библиотеки, в противном случае это просто садомазохизм.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Октябрь 25, 2024, 23:24 »

Да в студии используется стандартный компилятор(msvc toolset), а в Qt MinGW32bit
господи, какая же у тебя каша в голове... Нет никакого «стандартного компилятора», есть вполне конкретная версия msvc toolset, ее можно увидеть через установщик студии.
Т.е получается, что библа используемая в проекте должна быть собрана тем же компилятором что и сам проект иначе никак.
Я правильно понимаю?  Может можно как-то настроить?
да, правильно. Не понял что ты хочешь настроить.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 23.