Форум программистов, компьютерный форум 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. Шифрование в программе
Снова обращаюсь к гуру программирования. Возникла ещё одна проблема, причём уже давно. Некоторые пользователи жалуются на невозможность использования программы по причине НЕсохранения их данных в...
Я создаю утечки памяти ! C++
Нет, я не хочу похвастаться этим. Я любитель использовать быстрые решение для того чтобы реализовать алгоритм или проверить "чтобы работало", но как известно нет ничего более вечного, чем...
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
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
19.02.2014, 20:24  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Однако как я писал, компилятор не может определить сам где находится функция, поэтому он генерит прямой вызов, который потом делает прыжок на таблицу импорта (или не делает, если функция таки в нашем приложении).
(Дальше не читал). Это НЕ ТАК. Я, кстати, и предложил с этого начать наш разговор: компилятор ОТЛИЧНО МОЖЕТ ОПРЕДЕЛИТЬ, где находится функция, в dll или в текущем модуле, и это, заметьте, безо всякого _declspec(dllimport).

Поехали:

C++
1
2
3
4
5
6
7
8
//DLL-ка
/*A.cpp*/
#include <stdio.h>
 
extern "C" __declspec(dllexport) void my_func_dll () {
 printf ("Я нахожусь в теле dll\n");
 getchar ();
}
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
//экзешник
//B.cpp
#include <windows.h>
#include <stdio.h>
 
void my_func_exe () {
 printf ("Я нахожусь в теле экзешника\n");
 getchar ();
}
 
////////////////////////////////////////
 
extern "C" void my_func_dll ();
 
int main () {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 printf ("%x", my_func_exe);
 printf ("%x", my_func_dll);
 
 getchar ();
 
 my_func_exe ();
 my_func_dll ();
 
 
 return 0;
}
компилим:
Bash
1
2
3
4
5
6
7
8
9
10
11
rem удаляем A.dll и B.exe для чистоты эксперимента
del A.dll B.exe
 
rem Кропаем libAdll.a и A.dll
gcc -shared -o A.dll -Wl,--out-implib,libAdll.a A.cpp
 
rem Кропаем B.exe
gcc -o B.exe B.cpp -L./ -lA
 
rem удаляем libAdll.a
del libAdll.a
Смотрим в отладчике:

Так вот. Первый вызов этот вызов my_func_exe (); и адрес его ИЗВЕСТЕН, он- 40138C и по этому адресу находится тело функции, и сейчас туда будет прыжок. А следующий вызов- это вызов my_func_dll (); через таблицу импорта и её адрес найден при загрузке программы.

Да, вы написали:
Цитата Сообщение от DrOffset Посмотреть сообщение
прямой он может создать только если известен адрес! Адрес известен если функция в том же приложении.
, то есть вроде как вы писали, так в отладчике и есть. Пока нормально всё. Но далее ваши же слова:
Цитата Сообщение от DrOffset Посмотреть сообщение
компилятор не может определить сам где находится функция,
Может. Он это сделал САМ, безо всяких моих указаний __declspec(dllexport). Он отлично определил, что одна из функций находится ТУТ, а другая ТАМ. Он это сделал сам. Я не говорил ему, вы не говорили, никто не говорил.

Не по теме:

Так оставь вызов my_func_exe () как есть, а вызов my_func_dll () замени на good_kod, всё равно загрузчик напишет адрес функции в таблице импорта.



Вот хотя бы даже с этим разобраться, а потом двигаться дальше.
0
Миниатюры
Создание *.dll: для чего нужен компилятору параметр -DBUILD_DLL? (использую MinGW)  
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru