Понедельник, 25 Ноября 2024, 06:59

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Создание dll для Windows и Ubuntu
VinchensooДата: Пятница, 16 Декабря 2011, 19:20 | Сообщение # 1
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Добрый день. Просьба дать элементарный пример исходников dll под вин и убунту(я думаю, там другой формат динамической библиотеки, не знаю какой), в которой бы содержалась функция, выводящая в консоль "привет мир".

Сабж нужен на cpp. Никогда не делал либы, вот появилась необходимость. Кому не жалко, накидайте))

Просьба не кидать листинги из гугла с кучей непонятной фигни, нужен код с комментами без лишнего мусора, чтобы понять принцип.

Сейчас есть хэдэр с функциями, который нужно собрать в виде dll.


0x90Дата: Пятница, 16 Декабря 2011, 19:36 | Сообщение # 2
участник
Сейчас нет на сайте
Насчет убунту не знаю, но DLL создаются элементарно. Просто надо указать, что твоя функция экспортируемая, то есть сделать так:
Code

extern "C" __declspec(dllexport) void HelloWorld()
{
    printf("Hello world!");
}

Про функцию DllMain говорить не буду, так как в нашем простом случае она нафиг не нужна и может быть просто заглушкой.
VinchensooДата: Пятница, 16 Декабря 2011, 19:40 | Сообщение # 3
Злобный социопат с комплексом Бога
Сейчас нет на сайте
0x90, что значит "С" и почему именно С?

dllexport- константа?

Расскажи про dllmain, все-таки там код посерьезнее, чем хелло ворлд)) Эт я так, для примера спросил.

ЗЫ. Под убунту особенно интересно, так как мало туторов как-то.


BOOMДата: Пятница, 16 Декабря 2011, 19:42 | Сообщение # 4
I am the creator of ADE
Сейчас нет на сайте
Vinchensoo, здорова!!!
extern "C" - указывает, что функция написана на чистом C.
extern "C++" - указывает, что функция написана на чистом C++'е.

dllexport и dllimport это условные значения оператора __declspec
помимо существуют package, delphipackage и другие.

dllmain запускается при инициализации либы (загрузке в систему). Эта тема очень обширна, надо смотреть в книгах, или в доках SDK Windows.

0x90, а ты C++ Builder пользуешься???


______________________________
Я вернулся, и это чудо.
______________________________


Сообщение отредактировал BOOM - Пятница, 16 Декабря 2011, 19:45
VinchensooДата: Пятница, 16 Декабря 2011, 19:44 | Сообщение # 5
Злобный социопат с комплексом Бога
Сейчас нет на сайте
BOOM, привет)) Зачеты, в аське редко есть время трындеть(

У меня стоит кодблокс, но думаю запилить эклипс, насчет винды еще не знаю, насчет линукса точно эклипс.

ЗЫ. Решил, что под линем смысла собирать длл-ку нету, будет просто в хэдэре, а под винду актуально)) Мож еще какие-примеры, суть, как и что.

ЗЫЫ. Если кто знает насчет бубунты- пишите, для любопытства.


kirix820Дата: Пятница, 16 Декабря 2011, 19:46 | Сообщение # 6
участник
Сейчас нет на сайте
Формат динамической библиотеки в линукс - *.so
Больше подсказать ничего не могу. Ищи в интернетах.

Добавлено (16.12.2011, 19:46)
---------------------------------------------
И кстати, чем не устраивает кодблокс под линукс? Я в нем пишу на С.




Да будет роцк! Навсегда!
BOOMДата: Пятница, 16 Декабря 2011, 19:47 | Сообщение # 7
I am the creator of ADE
Сейчас нет на сайте

На счёт бубунты скажу, это тот же линуксоид, там только GUI API немного другие, ядро то же.


______________________________
Я вернулся, и это чудо.
______________________________
VinchensooДата: Пятница, 16 Декабря 2011, 19:48 | Сообщение # 8
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Quote (kirix820)
И кстати, чем не устраивает кодблокс под линукс? Я в нем пишу на С.

Он меня и под виндой не особо устраивает, не нравится и все. Хотя компилятор один, что в эклипсе, что в лине.
Quote (BOOM)
dllexport и dllimport это условные значения оператора __declspec помимо существуют package, delphipackage и другие.

ММ, ок. По идее, мне нужно будет в сторонний инструмент dll подключать через специальную систему, так что вызов функции из длл- не моя забота. Главное правильно написать и спроектировать.


kirix820Дата: Пятница, 16 Декабря 2011, 19:49 | Сообщение # 9
участник
Сейчас нет на сайте
Вообще, если мне нужен компилятор я просто юзаю gcc. Лучше ничего нету. А пишу или в кодблоксе или же в emacs



Да будет роцк! Навсегда!
BOOMДата: Пятница, 16 Декабря 2011, 19:50 | Сообщение # 10
I am the creator of ADE
Сейчас нет на сайте
Ну да, всё уже реализовано )))

______________________________
Я вернулся, и это чудо.
______________________________
kirix820Дата: Пятница, 16 Декабря 2011, 19:52 | Сообщение # 11
участник
Сейчас нет на сайте
Quote
На счёт бубунты скажу, это тот же линуксоид, там только GUI API немного другие, ядро то же.


GUI API везде одинаковые на линуксе. Основные используемые GTK и QT. В бубунте стандартно используется GTK (тк его требует гном, на основе которого построена Unity).

Добавлено (16.12.2011, 19:52)
---------------------------------------------
А писать можно хоть на чем. Убунта все равно воспринимает оба АПИ.




Да будет роцк! Навсегда!
0x90Дата: Пятница, 16 Декабря 2011, 19:52 | Сообщение # 12
участник
Сейчас нет на сайте
Quote (Vinchensoo)
0x90, что значит "С" и почему именно С?

Это значит, что экспортируется именно С функция, а не С++ к примеру. Это важно, так как С++ функции могут перегружаться и чтобы отличить одну от другую их названия "замангляются", то есть попросту замусориваются другими символами.
Quote (Vinchensoo)
dllexport- константа?

Да хз что это точно, скорее какая-то директива. Да и не важно что это, суть в том, что линкер регистрирует функции объявленные как dllexport в таблице экспорта выходного PE файла(это может быть как DLL так и EXE).
Quote (Vinchensoo)
Расскажи про dllmain, все-таки там код посерьезнее, чем хелло ворлд)) Эт я так, для примера спросил.

В любой DLL должна быть функция DllMain, она вызывается при загрузке и выгрузке библиотеки. Ее назначение инициализировать и освобождать ресурсы, которые будут необходимы твоим экспортируемым функциям. Если ничего такого твоим функциям не нужно можно просто оставить там return 1, но функция эта должна быть в любом случае, хотябы в качестве заглушки. Ее прототип:
Code

BOOL WINAPI DllMain (HANDLE hInst,DWORD dwReason, LPVOID IpReserved);
BOOMДата: Пятница, 16 Декабря 2011, 19:53 | Сообщение # 13
I am the creator of ADE
Сейчас нет на сайте
kirix820, но их две, поэтому я и написал "немного"...

______________________________
Я вернулся, и это чудо.
______________________________
VinchensooДата: Пятница, 16 Декабря 2011, 19:58 | Сообщение # 14
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Quote (0x90)
Это значит, что экспортируется именно С функция, а не С++ к примеру. Это важно, так как С++ функции могут перегружаться и чтобы отличить одну от другую их названия "замангляются", то есть попросту замусориваются другими символами.


Code
extern "C" __declspec(dllexport) void HelloWorld()  
  {  
     cout<<"Hello world!";  
  }

Сожрется? Или эта константа отвечает не только за то, что функция 100% не была перегружена, но и за то, что внутри используется?

С остальным ясно. Нужно пробовать.


BOOMДата: Пятница, 16 Декабря 2011, 20:00 | Сообщение # 15
I am the creator of ADE
Сейчас нет на сайте
Vinchensoo, в зависимости от реализации компилятора. В основном НЕТ, будет ругаться большими матами )))
--------
Вообще, директива
Code
extern "C"
отвечает за переключение режима компиляции кода, указывая на то, что функция, либо часть кода написана на чистом Си. Это сделано для совмещения двух языков. При этой директиве даже int меняет свои свойства, согласно стандартам Си.


______________________________
Я вернулся, и это чудо.
______________________________


Сообщение отредактировал BOOM - Пятница, 16 Декабря 2011, 20:03
0x90Дата: Пятница, 16 Декабря 2011, 20:34 | Сообщение # 16
участник
Сейчас нет на сайте
Quote (Vinchensoo)
Сожрется?

Должен сожраться чем угодно. Под рукой просто нет компилятора, но внутри функции ты можешь делать все что угодно и совершать самые жестокие ООП ритуалы.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг