|
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
|
|
Компиляция и использование DLL12.08.2018, 18:28. Показов 16659. Ответов 23
Метки нет (Все метки)
Простой, вроде-бы вопрос: как в с++ скомпилировать dll? Как его в последствии использовать? И я имею в виду компиляцию при помощи MinGW (g++.exe), а не при помощи всяких там сторонних редакторов с их непонятно как работающими компиляторами, где для компиляции dll достаточно в свойствах проекта указать, что ты компилируешь dll... Проблема как раз в том, что все гайды по dll, которые я находил, как раз и подразумевали компиляцию при помощи всяких там Visual Studio... А как это сделать из командной строки (или, в моём случае, из notepad++ и nppexec) при помощи g++.exe?
И вообще, что на самом деле представляет из себя dll? Если я буду представлять его как набор заранее скомпилированных функций, которые я смогу использовать в своей программе, если подключу dll, при этом с сохранёнными названиями функций, это будет правильно? Есть ли какой-нибудь способ узнать содержимое dll файла (какая-нибудь легковесная программа, разбирающая прямо каждый байт dll-файла? (вообще, мне бы и для exe подобная пригодилась бы, но пока и для dll хватит))
0
|
|
| 12.08.2018, 18:28 | |
|
Ответы с готовыми решениями:
23
Компиляция dll библиотеки Компиляция функции в dll на С++ Компиляция dll на win8x64 и ошибка на winXP |
|
|
|
| 12.08.2018, 20:33 | |
|
1
|
|
|
Неэпический
|
|
| 12.08.2018, 20:41 | |
|
1
|
|
|
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
|
|||||||||||
| 12.08.2018, 23:51 [ТС] | |||||||||||
|
А сейчас, возможно, совсем тупой вопрос, но... В чём разница между типами int(*)(int, int) и int*(int, int) ?
Почему этот код:
0
|
|||||||||||
|
|
||
| 13.08.2018, 00:21 | ||
|
Max_Cross, первое это указатель на функцию, возвращающую int
второе это и есть объявление(declaration) функции, только не int возвращающей, а указатель на int Добавлено через 5 минут int main(){ main=(int ())GetProcAddress(hinstLib, "TestAddValFuncFromExtDLL");//ну бред же, согласись! }
1
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||||||||
| 13.08.2018, 00:29 | ||||||||||||
0
|
||||||||||||
|
|
|||
| 13.08.2018, 09:12 | |||
![]() для справки: в Visual Studio, как и в вашем непонятном MinGW, достаточно просто указать в свойствах проекта, что ты компилируешь dll. - статической либой (*.lib) (#pragma comment (lib, "*.lib")) - динамической библиотекой (*.dll) (HMODULE hMod = LoadLibrary("*.dll") с последующим GetProcAddress(hMod, "name function")).
0
|
|||
|
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
|
|
| 13.08.2018, 09:22 [ТС] | |
|
Так я про это и писал... Мне этим и ненравятся большинство современных редакторов - используя их - один фиг ты поймёшь, как пользоваться компилятором... Делают кучу непонятных действий за тебя, а как не окажется у тебя под рукой Visual Studio, так фиг ты что сам сделаешь... Этот опыт с попыткой банально компилировать dll без сторонних редакторов это только доказал... Поэтому я сейчас ставлю себе VSCode, и надеюсь, что хоть он не будет считать себя умнее меня (даже если это так и есть)...
И неужели, если у меня есть ТОЛЬКО dll, мне обязательно её самому подключать, обязательно объявлять указатели для каждой функции, обязательно получать адрес каждой функции? Нет какого-нибудь волшебного способа это одной строчкой сделать, что-бы я в последствии смог использовать все функции dll, как если бы они были подключены статически (насколько я помню, в C# так можно... Правда там я как раз Visual Studio использовал...) P.S Что значит "КАК и в вашем MinGW"? В MinGW я как раз таки использую компилятор g++.exe из командной строки, то есть, всё делаю сам, и, соответственно, знаю, что делаю...
0
|
|
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,911
|
|||||||||||||
| 13.08.2018, 10:23 | |||||||||||||
2
|
|||||||||||||
| 13.08.2018, 10:43 | |
|
0
|
|
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,911
|
|
| 13.08.2018, 11:55 | |
|
Croessmah, "обычно"? Мне казалось, такая линковка - исключительный случай. Либо библиотека стандартная, как libc или какой-нибудь SDL, и тогда она лежит в стандартном месте. Либо она нестандартная и может вовсе отсутствовать, как разнообразные плагины, и тогда линковка должна быть динамической.
А жестко линковать самописную библиотеку в нестандартном месте это какой-то средний вариант, широкой области применений которому я с ходу не вижу.
0
|
|
|
Неэпический
|
|
| 13.08.2018, 12:08 | |
|
COKPOWEHEU, и стандартные библиотеки могут быть разных версий, что в линуксах очень часто бывает. Да и свои библиотеки можно положить куда-то в свои директории. Тот же steam содержит steam.sh, который меняет LD_LIBRARY_PATH
0
|
|
|
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
|
||||||
| 13.08.2018, 17:52 [ТС] | ||||||
|
И ещё вопрос, что-за Multi-Byte char/Wide char и как это влияет на работу приложения?
А то тут мой VS Code начал ругаться на строку
, притом, у компилятора к этой же самой строке претензий нет... Если же использовать L"TestDLL.dll" вместо "TestDLL.dll", то претензии появляются, наоборот, у компилятора... Как я понимаю, Wide char - это wchar_t (занимающий, как я понял, 2 байта), Multi-Byte char - это просто char, LoadLibrary - это define, который, в зависимости от наличия define _UNICODE использует либо LoadLibraryW, которая использует wchar_t, либо LoadLibraryA, использующую обычный char... И я, конечно, понимаю, что я могу просто использовать LoadLibraryA вместо LoadLibrary, и тогда претензий не будет ни у VS Code, ни у компилятора, но раз уж возникла проблема, я бы хотел не просто её решить, а понять, почему она возникла... И так, что это за типы? Чем они отличаются? В чём разница между функциями, использующими wchar_t, и аналогичными с обычным char? Почему VSCode вдруг решил, что у меня где-то стоит define _UNICODE? Как заставить g++.exe использовать именно Wide char, или наоборот, VS Code не использовать Wide char, и на что это всё в конце концов повлияет?
0
|
||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||
| 13.08.2018, 19:37 | |||
#include <windows.h> поставить #undef _UNICODE
0
|
|||
|
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
|
||||||||||||||
| 13.08.2018, 22:05 [ТС] | ||||||||||||||
Судя по всему, VSCode либо по каким-то причинам считает, что define _UNICODE имеется, либо тупо берёт самое первое определение __AW_SUFFIXED__, которое ему попадётся... Вот только как решить это, я так и не понял... Добавлено через 32 секунды Добавлено через 2 часа 13 минут Но... Нет ли способа залинковать c dll прямо из кода... Я видел, как c .lib файлами линкуют при помощи #pragma comment(lib, "file.lib"), но, как ни странно, с dll способ у меня не прокатывает... Не хочется просто каждый раз редактировать команду, из кода удобнее. P.S Как-то странно линковать через командную строку... Просто я могу написать "TestDLL.dll" хоть сразу после "g++", перед именем файла, хоть после имени, перед "-o", хоть вообще в самом конце - работает во всех случаях... P.P.S Мой предыдущий вопрос о wchar_t и примирении VSCode с g++ по прежнему в силе...
0
|
||||||||||||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
|||||
| 14.08.2018, 08:59 | |||||
-D_UNICODEДля VS Code - покопаться в настройках и найти переключатель, который за это отвечает.
1
|
|||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,911
|
||||||||||||
| 14.08.2018, 10:42 | ||||||||||||
|
Ограничение 16 бит wchar_t в windows это попытка microsoft сэкономить на редкоиспользуемых символах. В других системах размер wchar_t может составлять 32 бита.
2
|
||||||||||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
||
| 14.08.2018, 11:18 | ||
|
Данное поведение является поведением по умолчанию, начиная с Windows XP.
2
|
||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,911
|
|
| 14.08.2018, 22:26 | |
|
DrOffset, то есть тот же multibyte char, только уже по 16 бит. Смысл wchar_t не в изобретении multibyte поверх utf-16, а в представлении любого символа текущей локали одной переменной (информация из стандарта). То что когда-то давно локалью по умолчанию считалось utf-16, а до того cp1251, а еще раньше 866 - не оправдание.
0
|
|
|
Неэпический
|
||
| 14.08.2018, 22:34 | ||
). То бишь суррогатные пары - часть UTF-16, а не какая-то надстройка. Если убрать из UTF-16 суррогатные пары, то получим UCS-2.
0
|
||
| 14.08.2018, 22:34 | |
|
Помогаю со студенческими работами здесь
20
Компиляция консольного приложения. Ошибка msvcp120.dll Компиляция Sqlite3.dll в Visual C++ 6. Нужны умные головы профессионалов Дизассемблирование DLL, правка кода и компиляция его в DLL Использование String Tables в .dll(.dll.mui) (Для VB .NET) Компиляция .cs в .dll Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|