Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/88: Рейтинг темы: голосов - 88, средняя оценка - 4.82
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69

Компиляция и использование DLL

12.08.2018, 18:28. Показов 17303. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Простой, вроде-бы вопрос: как в с++ скомпилировать dll? Как его в последствии использовать? И я имею в виду компиляцию при помощи MinGW (g++.exe), а не при помощи всяких там сторонних редакторов с их непонятно как работающими компиляторами, где для компиляции dll достаточно в свойствах проекта указать, что ты компилируешь dll... Проблема как раз в том, что все гайды по dll, которые я находил, как раз и подразумевали компиляцию при помощи всяких там Visual Studio... А как это сделать из командной строки (или, в моём случае, из notepad++ и nppexec) при помощи g++.exe?

И вообще, что на самом деле представляет из себя dll? Если я буду представлять его как набор заранее скомпилированных функций, которые я смогу использовать в своей программе, если подключу dll, при этом с сохранёнными названиями функций, это будет правильно? Есть ли какой-нибудь способ узнать содержимое dll файла (какая-нибудь легковесная программа, разбирающая прямо каждый байт dll-файла? (вообще, мне бы и для exe подобная пригодилась бы, но пока и для dll хватит))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2018, 18:28
Ответы с готовыми решениями:

Компиляция dll библиотеки
Как правильно скомпилировать dll библиотеку, чтобы имена методов не изменялись? Например, у меня есть метод с именем Java_Test_test, а...

Компиляция функции в dll на С++
Всем привет. Есть функция для фильтрации сигнала. Пытаюсь разобраться как скомпилировать из неё dll. Просмотрел несколько видео на...

Компиляция dll на win8x64 и ошибка на winXP
Компилирую длл библиотеку на Windows 8 (x64), потом пытаюсь воспользоваться на windows xp и вылеатет Точка входа в процедуру...

23
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.08.2018, 01:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Смысл wchar_t
Мы разве где-то про "смысл" вообще говорили?
Я вроде бы очень четко дал понять что именно я уточняю и по какому поводу. Всю информацию, которую я дал, легко проверить. Например тут: https://docs.microsoft.com/ru-... characters

Ну хорошо, давайте поговорим про смысл.
Для начала надо бы понять, что такое UCS-2. UCS-2 - это название представления юникода, которое было описано в стандарте Unicode 1.1, в котором, на минуточку, вообще не было 32-битных кодов. Т.е. на тот момент вообще во всем юникоде не было кодов, которые выходили бы за пределы 16 бит. Первая версия Windows, в которой появилась поддержка юникода, была Windows NT 3.1, и вышла она в 1993 году, между прочим всего через месяц после релиза стандарта Unicode 1.1. К чему мы тут пришли? К простому выводу: ни о какой экономии разработчики Windows думать не могли, т.к. на тот период они использовали самые передовые технологии (стандарты) в этой области и выбранные ими 16 бит для хранения юникода было полностью оправдано.

Далее, в 1996 году вышел стандарт Unicode 2.0, в котором ввели UTF16 с его суррогатными парами. В это время Microsoft уже была мегакорпорацией, со всеми ее бюрократическими моментами. Как следствие, поддержку UTF16 мы увидели только в Windows 2000, а по умолчанию она стала применяться только в Windows XP. Тут сказывалась и потребность в обеспечении совместимости, т.к. потеря совместимости - это потеря клиентов.

Почему оставили 16-битный вариант? Разумеется по той же причине, по которой Linux сейчас по умолчанию использует восьмибитный UTF8, а не 32-битный UTF32: легче проводить миграцию.

Как видно, ничего Microsoft специально не урезал, никакие байты не экономил. Просто история и время диктовали свои правила, как и всегда.

Для справки, UTF32 - был формализован только в стандарте Unicode 4.0 (2003). При этом, естественно, wchar_t существовал в стандарте С с самого начала. В том же стандарте никогда не было
If wchar_t (see 7.17) is defined as a signed integer type, the value of WCHAR_MIN
shall be no greater than −127 and the value of WCHAR_MAX shall be no less than 127;
otherwise, wchar_t is defined as an unsigned integer type, and the value of
WCHAR_MIN shall be 0 and the value of WCHAR_MAX shall be no less than 255.219.
строгого ограничения на размер этого типа, поэтому говорить про смысл, якобы хранения там 32-битных кодов, не приходится.
Т.е. причина того, что цитата
wchar_t which is an integral type whose range of values can represent distinct codes for all members of
the largest extended character set specified among the supported locales.
....
wide character
bit representation that fits in an object of type wchar_t, capable of representing any character in the current locale
на которую вы выше сослались, расходится с реальным положением вещей (когда один объект wide char не может на некоторых платформах вместить в себя все символы текущей локали), так вот, причина этого не в том, что Microsoft "не поняли" смысла wchar_t, а в том, что понятие "unicode" развивалось независимо от стандартов Си и С++. Как пример, те же стандарты С совсем никак не описывали UTF8. Более того, как раз таки на период разработки поддержки юникода в Windows 16-битный wchar_t полностью соответствовал своему "смыслу", т.к. на тот период не было локалей, в которых был бы character set не умещающийся в 16 бит (об этом уже выше говорил).
2
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,101
15.08.2018, 10:18
И еще раз процитирую стандарт:
Цитата Сообщение от C11
7.19
wchar_t
is an integer type whose range of values can represent distinct codes for all members of the largest extended character set specified among the supported locales
wchar_t - целочисленный тип, обеспечивающий хранение полного диапазона кодов символов для всех поддерживаемых локалей
C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include <wchar.h>
 
int main(int argc, char **argv){
  wchar_t str[]=L"

		
		
		
		
		
		
		
		
		
		

		
			
0
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
18.08.2018, 19:40  [ТС]
Я тут пытался настроить проект на freeglut. Но он был настроен таким образом, что мне обязательно приходилось линковать стандартным образом (-lfreeglut). А я же упёртый, мне нужно именно с dll (просто потому-что). Попытался слинковать с dll, получил 8 ошибок, ссылающиеся на неопределённые функции:

undefined reference to `_imp____glutInitWithExit@12'
undefined reference to `_imp____glutCreateWindowWithExit@8'
undefined reference to `_imp____glutCreateMenuWithExit@8'
undefined reference to `_imp__glutInitDisplayMode@4'
undefined reference to `_imp__glutInitWindowSize@8'
undefined reference to `_imp__glutInitWindowPosition@8'
undefined reference to `_imp__glutDisplayFunc@4'
undefined reference to `_imp__glutMainLoop@0'

Сначала не понял, с чего это вдруг компилятор решил к именам функций _imp__ добавить (в конце концов, extern "C" там стоит, имена функций меняться не должны)... Решил заглянуть в хедер, и, например, функция __glutInitWithExit там определена как
C++
1
FGAPI void FGAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
FGAPI - дефайн, заменяющийся (в моём случае) на __declspec(dllimport) (блин, есть ли способ называть это как-то более красиво? А то "Дефайн, заменяющийся на..." ). Я подумал, что дело именно в этом, поэтому в самом дефайне закоментил часть, и получил
C++
1
define FGAPI// __declspec(dllimport)
Как ни странно, способ сработал - всё нормально скомпилировалось, и, более того, когда я положил freeglut.dll в папку с exe, всё даже заработало... Но, тем не менее, я получил 8 варнингов от линкера:

Warning: resolving ___glutInitWithExit@12 by linking to ___glutInitWithExit
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups
Warning: resolving ___glutCreateWindowWithExit@8 by linking to ___glutCreateWindowWithExit
Warning: resolving ___glutCreateMenuWithExit@8 by linking to ___glutCreateMenuWithExit
Warning: resolving _glutInitDisplayMode@4 by linking to _glutInitDisplayMode
Warning: resolving _glutInitWindowSize@8 by linking to _glutInitWindowSize
Warning: resolving _glutInitWindowPosition@8 by linking to _glutInitWindowPosition
Warning: resolving _glutDisplayFunc@4 by linking to _glutDisplayFunc
Warning: resolving _glutMainLoop@0 by linking to _glutMainLoop

Отсюда несколько вопросов:
1) Что это за варнигри? Я смог найти только, как их исправить (хотя, фактически, тут и искать не нужно, компилятор сам подсказал), но что они означают я так и не понял...
2) В этом хедере объявлена куча функций, что не так именно с этими 8-ю?
3) И вообще, отличается ли чем-нибудь линковка с dll от стандартной линковки (через -l, с .lib/.a файлами)? И что это за .a файлы (libfreeglut.a, в моём случае)? Ну, то есть, тут можно догадаться, что это что-то вроде библиотек импорта... Но разве линковка не должна происходить с .lib или .o файлами (ну или с dll, если быть таким же упёртым, как я, учитывая, что везде, где я читал, про dll говорили, что их можно только подключать через LoadLibrary, а про возможность линковки я только тут узнал)? А то мне что-то непонятно, зачем вообще всякие .lib файлы тогда нужны (кроме возможных проблем с именами функций).
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
18.08.2018, 22:13
Цитата Сообщение от Max_Cross Посмотреть сообщение
Ну, то есть, тут можно догадаться, что это что-то вроде библиотек импорта... Но разве линковка не должна происходить с .lib или .o файлами
*.a - это библиотека импорта. Или статическая библиотека. В зависимости от того, как ее делали. Но в твоем случае - это библиотека импорта. У mingw свой формат для них. Т.е. это полный аналог lib, в данном случае, только в формате mingw.

Цитата Сообщение от Max_Cross Посмотреть сообщение
Что это за варнигри?
https://stackoverflow.com/ques... all-suffix

Цитата Сообщение от Max_Cross Посмотреть сообщение
В этом хедере объявлена куча функций, что не так именно с этими 8-ю?
Ну значит именно они прямо или косвенно используются, а остальные нет.

Цитата Сообщение от Max_Cross Посмотреть сообщение
И вообще, отличается ли чем-нибудь линковка с dll от стандартной линковки (через -l, с .lib/.a файлами)?
Это называется direct linking (и появилось это не так давно).
Читаем документацию: https://access.redhat.com/docu... win32.html

Добавлено через 3 минуты
Цитата Сообщение от Max_Cross Посмотреть сообщение
мне обязательно приходилось линковать стандартным образом (-lfreeglut). А я же упёртый, мне нужно именно с dll
Линкуя с библиотекой импорта, ты и так линкуешься с dll.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.08.2018, 22:13

Компиляция консольного приложения. Ошибка msvcp120.dll
Добрый день. Cсоздаю проект консольного приложения фреймворк 2.0 ставлю(не знаю влияет ли это на проблему) Компилировал на релизе на двух...

Компиляция Sqlite3.dll в Visual C++ 6. Нужны умные головы профессионалов
Доброе время суток уважаемые программисты! В языке C++ я даже не новичок, а лузер (так пару dll делал). Я редко у кого прошу помощи,...

Дизассемблирование DLL, правка кода и компиляция его в DLL
ни разу не писал на c#, не пользовался monodeveloperом. сделано следующее: 1. дизассемблировал библиотеку name.dll, использовал...

Использование String Tables в .dll(.dll.mui) (Для VB .NET)
Здравствуйте. Нужно извлечь(а потом запоковать) таблицу строк(string tables ). Допустим есть файл explorerframe.dll.mui из...

Компиляция .cs в .dll
Добрый день. Уважаемые форумчане, помогите с компиляцией .cs кода в .dll По определённым причинам выложить код не могу, могу скинуть...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru