Форум программистов, компьютерный форум CyberForum.ru

Создание *.dll: для чего нужен компилятору параметр -DBUILD_DLL? (использую MinGW) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа с файлом типа fstream http://www.cyberforum.ru/cpp-beginners/thread1091503.html
Пишем несложный код: fstream file("Test.txt",ios_base::in|ios_base::app); int cnt = 0; while (cnt < 3) { cerr << char(file.get()); cnt++; }
C++ Эмулятор. На С, С++ Здравствуйте уважаемые читатели форума! У меня такой вопрос: (СРАЗУ ПРЕДУПРЕЖДАЮ Я НЕ ОЧЕНЬ ХОРОШО РАЗБИРАЮСЬ ПОКА В ЭТОМ ТАК ЧТО ОЧЕНЬ МНОГОЕ ИЗ МОИХ СЛОВ МОЖЕТ БЫТЬ ЖУТКИМ ....) В качестве зачетного задания преподаватель задал написать эмулятор процессора, (ну вначале придумать архитектуру, и написать эмулятор этого). Шаблон он дал, там был примитивный ассемблер, написанный на перле. И на С... http://www.cyberforum.ru/cpp-beginners/thread1091494.html
C++ Использование стороннего CSP. Шифрование в программе
Снова обращаюсь к гуру программирования. Возникла ещё одна проблема, причём уже давно. Некоторые пользователи жалуются на невозможность использования программы по причине НЕсохранения их данных в форме ввода. Хотя автосохранение стоит. На данный момент в программе используется виндовый CryptAcquireContext для шифрования введённых данных (логин и пароль для доступа к персональному кабинету...
Я создаю утечки памяти ! C++
Нет, я не хочу похвастаться этим. Я любитель использовать быстрые решение для того чтобы реализовать алгоритм или проверить "чтобы работало", но как известно нет ничего более вечного, чем временное... ... время идет, а код остается :wall: Образец:HTEXTURE tex; tex = hge->Load_Texture("texture.png"); hgeSprite* sprite = new hgeSprite(tex,0,0,50,50); sprite->Render(); //Play delete sprite;...
C++ Каким образом идет поиск слов в кавычках? http://www.cyberforum.ru/cpp-beginners/thread1091483.html
Доброго времени суток! Вот вся программа #include <fstream> #include <iostream> #include <string> int main() { std::ofstream ofs("test.txt");
C++ Умножить матрицу 10х10 на вектор из 10 элементов дана матрица:10*10.умножить ее на вектор 10.помогите пожалуйста...очень нужно подробнее

Показать сообщение отдельно
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.02.2014, 19:05  [ТС]     Создание *.dll: для чего нужен компилятору параметр -DBUILD_DLL? (использую MinGW)
Цитата Сообщение от kravam Посмотреть сообщение
__declspec(dllexport)
влияет на запихивание в таблицу экспорта? В смысле не куда-то там, а в определённой место, называемое таблицей экспорта?

+++++++++++++++++++++++++++++++++++++++++++++++++++++

экзешник
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//A.cpp
#include <stdio.h>
#include <windows.h>
 
extern "C"
__declspec(dllexport) void functsia_0 () {
  printf ("это я и меня звать %s, я объявлена со спецификатором __declspec(dllexport)\n", __FUNCTION__);
}
 
extern "C" void functsia_1 () {
  printf ("это я и меня звать %s, я объявлена без спецификатора __declspec(dllexport)\n", __FUNCTION__);
}
 
extern "C"
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved )  
{
    return TRUE; 
}
C++
1
 
dll-ка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//B.cpp
#include <windows.h>
#include <stdio.h>
 
 
int main ()
 
{
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
      HMODULE DeskriptorModula= LoadLibrary ((char*)"A.dll");
      FARPROC 
                           //++++++
                           //++++++
                           //++++++
      adres_funktsii= GetProcAddress (DeskriptorModula, "functsia_0");
                           //коммент 
      (*adres_funktsii)();
 
      adres_funktsii= GetProcAddress (DeskriptorModula, "functsia_1");
                           if(adres_funktsii)
      (*adres_funktsii)();
                           //++++++
                           //++++++
                           //++++++
 
      printf ("%x\n", adres_funktsii);      
      
      
      return (0);
 
}

Bash
1
2
это я и меня звать functsia_0, я объявлена со спецификатором __declspec(dllexport)
0
Что же, ТЕПЕРЬ можно сказать, что для первого случая компилятор заточен правильно- действительно- если в dll есть ОДНА функция, да и та не экспортируется, на кой она нужна? Поэтому на экспорт её, безо всяких __declspec(dllexport)

Для настоящего случая, компилятор мог быть и поумнее- если есть две или больше АВТОНОМНЫХ функций, то опять, на кой они нужны, как не на экспорт? Но он, видать, считает, что одна может вызываться из другой и тем самым не идти на экспорт, (поэтому на экспорт отправляет ту, которая __declspec(dllexport)) На месте компилятора я бы так и думал. Хотя анализ кода доказывает обратное. Но без претензий. Главное, что разобрались. Но вернёмся к нашим баранам.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Итак, необходимость явно указывать __declspec(dllexport) несомненна. Изначально вопрос стоял так- мы либо указываем __declspec(dllexport) (директивой компилятора -DBUILD_DLL), либо указываем- внимание, в том же самом месте __declspec(dllimport):

C++
1
2
3
extern "C"
Export //Тут будет либо __declspec(dllexport), либо __declspec(dllimport)
void foo () {}
и это, заметье, не хидер, а сырец. Минутку, это я если я не укажу компилятору директиву -DBUILD_DLL, то эта функция пойдёт на иморт? То есть я в коде dll-ки напишу функцию и укажу компилятор, что я же эту функцию буду в эту же dll-ку импортировать? Это прямо нонсенс какой-то. Все функции, у которых есть тела по определению не могут ОТКУДА-ТО импортироваться. То есть они УЖЕ ЕСТЬ в этом модуле. Экспортироваться- пожалуйста, импортироваться- нет. Вообще определять функцию как импортируемую- нелепость. Это всё равно что сказать компилятору- "Эта функция у меня есть. Но я её импортирую." Или в переводе на человеческий язык: "У меня есть яблоко, но я его куплю".
 
Текущее время: 13:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru