Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Офтопик > Мысли вслух
Перезагрузить страницу Разработка и использование DLL
Ответ
 
Опции темы Опции просмотра
  (#46 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 17.02.2012, 12:01

В GCC тоже нет проблем. Код:
cpp Код:
// main.h
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */


#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

void DLL_EXPORT SomeFunction(const LPCSTR sometext);

int __declspec(dllexport) TestFunction(int x);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H_

//---------------------------------------------------
// main.c
#include "main.h"

// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}

int __declspec(dllexport) TestFunction(int x)
{
    return x + 5;
}
Компиляем это хозяйство:

D:\TOOLS\Unix Tools\MinGW-GCC-4.7.0\bin>gcc -DBUILD_DLL -shared -o main.dll main.c

Получаем экспорт без манглинга имен, в чем можно убедится с помощью Depends.exe или любой другой утилиты просмотра экспорта по вашему выбору :-)


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#47 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 17.02.2012, 12:21

Никакой разницы со своим вариантом не вижу. Кроме одной: у Вас тут нет указания _stdcall. Речь именно об этом случае. Как у Вас - _cdecl. С ним проблем и у меня нет.

cpp Код:
__declspec(dllexport) int _stdcall func(char *path)

Последний раз редактировалось Бобо; 17.02.2012 в 12:25
Ответить с цитированием
  (#48 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 17.02.2012, 12:44

Опять же никаких проблем :-) Коллега Alexiski тебе ж писал, что первая же строка в поиске выдает решение.
Добавляем в определения DLL_EXPORT еще и __stdcall, а в командную строку добавляем еще и опцию -Wl, передаваемую линкеру:
> gcc -DBUILD_DLL -shared -o main.dll main.c -Wl,--kill-at

Вуаля. Получаем на выходе DLL файл, с экспортом stdcall и без мангления имен.


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
Ads
  (#49 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 17.02.2012, 12:54

А как в CodeBlock вставить? Если сую в Compiler settings - Other options или в Linker settings - Other... получается ошибка. Если в линкер добавляю -kill-at, ошибки нет, но и эффекта - тоже.

В любом случае, они вызываются нормально, без @4.

Только, в gcc, вместо _stdcall, надо писать WINAPI. Или добавить чёрточку: __stdcall.

Последний раз редактировалось Бобо; 17.02.2012 в 13:00
Ответить с цитированием
  (#50 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 17.02.2012, 13:01

Project build options -> Linker settings -> Other linker options -> добавить -Wl,--kill-at


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
Ads.
  (#51 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 17.02.2012, 13:13

Если писать через запятую, как здесь - ошибка. А если на разных строках - не помогает.
Ответить с цитированием
  (#52 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 17.02.2012, 13:17

Гм. Тогда смотри доки по твоему Code::Blocks. У меня 10.05 - возможно, они где-то отличаются... 10.05 скушал именно так с удовольствием :-) И построил нужную DLL, разумеется, с немангленным экспортом.
Ну и может, конечно, дело еще в версиях GCC.... у меня стоит 4.7.0. Тогда надо еще курить доки по соответствующей версии gcc.


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#53 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 17.02.2012, 13:23

Вряд ли это зависит от CodeBlock - ошибки-то показывает линкер... И ему ничего не помогает. CodeBlock у меня - такой же, а MinGW - 4.4.1. Скачаю новый...

PS: новую скачала, и dll вообще не работает. Нет библиотеки LIBGCC_S_DW2-1.DLL

Последний раз редактировалось Бобо; 17.02.2012 в 14:26
Ответить с цитированием
  (#54 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,266
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 17.02.2012, 16:03

Цитата:
Сообщение от Бобо Посмотреть сообщение
Если в линкер добавляю -kill-at
Как Вы понимаете, опция именно линкера. Поэтому она сильно зависит от текущего используемого линкера и способа сборки. Универсального решения нет.
Если используется dlltool, то в линкер добавлять --kill-at
Один или два минуса перед параметром - в продуктах из-под linux большая разница.

Цитата:
Сообщение от Влад Посмотреть сообщение
Project build options -> Linker settings -> Other linker options -> добавить -Wl,--kill-at
А вот это выдавать в linker options - неправильно. Ибо весь смысл опции -Wl состоит в том, чтобы заставить компилятор передать последующие опции линкеру. То есть либо -Wl,--kill-at компилятору, либо напрямую --kill-at линкеру
Ответить с цитированием
  (#55 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 17.02.2012, 16:15

Цитата:
Сообщение от Alexiski Посмотреть сообщение
А вот это выдавать в linker options - неправильно. Ибо весь смысл опции -Wl состоит в том, чтобы заставить компилятор передать последующие опции линкеру. То есть либо -Wl,--kill-at компилятору, либо напрямую --kill-at линкеру
К сожалению, это единственный способ. Я уверен, что это косяк именно в организации пользовательского интерфейса среды Code::Blocks (точнее, только в виндоусном порте CB) - строка -Wl,--kill-at тупо передается в командую строку g++. Ну и дальше попадает по назначению - компилятор потом передает ее линкеру.


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#56 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 19.02.2012, 01:27

Новая версия скушала "-Wl,--kill-at", и сделала нормальную DLL. libgcc_s_dw2-1.dll нашлась - инсталлятор сбил PATH, хотя устанавливалось в ту же папку. Чтобы линковал с ней статически - "-static-libgcc". Вообще же, это - подвох. Старая версия её не требовала, и программы, сделанные в новой для распространения, могли неожиданно оказаться неработающими.
Ответить с цитированием
  (#57 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,266
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 19.02.2012, 03:22

Вы будете удивляться, но Microsoft в этом плане еще круче. Начиная с восьмерки, насколько я помню, уже недостаточно просто приложить к проекту библиотеки. Обязательно нужно инсталлировать рантайм. Плюс код в стартовом модуле, который не работает на XP SP1..
Ответить с цитированием
  (#58 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 19.02.2012, 19:52

По какой причине это делается?

Вообще, громоздкость - в интересах больших фирм. Она исключает конкуренцию со стороны многочисленных одиночек. Если всякий приличный проект требует организованной работы множества людей, крупные фирмы - вне конкуренции. Фирмачи ушлые: кинут этим любителям замануху, и те поведутся.

Я тут писала, но меня не поняли: разделение на "профессиональное" и "любительское" будет всё более чётким. И это - не в смысле знаний и талантов, а в смысле "промышленное/кустарное". Уделом таких программистов (даже на фирмах, кгде в штате их - несколько человек), будет лишь обслуживание фирменных систем и использование их возможностей. Можно уметь ремонтировать стратегический бомбардировщик, но в одиночку сделать его невозможно. В идеале, даже самое простое фирменное изделие должно резко отличаться от любительщины, и быть недосягаемым для любителей независимо от квалификации.

Последний раз редактировалось Бобо; 19.02.2012 в 20:24
Ответить с цитированием
  (#59 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 19.02.2012, 20:35

У Майкрософт с сишным рантаймом все обстоит еще интереснее....

Вот были версии VC6 (98), VC7 (2002), VC7.1 (2003) - они не требовали никаких дополнительных инсталляций, самое большее, что нужно было сделать - это положить рядом с исполяемым exe файлом библиотеки типа msvcp71.dll.... и т.п. Все изменилось в 2005 году с выходом VC8 (2005) - в этой среде впервые MS ввели понятие "манифеста", описывающего зависимости исполняемых модулей (exe и dll) друг от друга. Идея-то была благая - разрулить т.н. DLL Hell. В результате, пришлось кроме собственно программы ставить еще и соответствующий рантайм - vcredist_x86, да не просто "рантайм", а - правильной версии (Вот с этим тоже вышли неслабые грабли! учитывая, что постоянно вносились "фиксы".... лично мне приходилось для программы, собранной в 2005 Студии, только для VC++ 2005 SP1 кропотливо подбирать один из пяти различных рантаймов! и, как назло, все они именовались одинаково - vcredist_x86, различались только отсылкой к разным статьям knowledge base.). Короче, хотели как лучше, а получилось, как всегда, - вместо DLL Hell получили Manifest Hell. В 2008-й Студии ситуация сохранилась.

А теперь - внимание, барабанная дробь! - вышла 2010 Студия! В ней ситуация с рантаймом откатилась на прежнюю позицию, - теперь достаточно рядом с exe файлом просто положить соответствующие файлы типа msvcp10.dll.....

И стоило ради этого копья ломать? :-)


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#60 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 19.02.2012, 20:45

Видимо, и там дураков полно...
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка социальных игр patap Работа 0 23.08.2011 20:03
Разработка - СУБД fdb Nfox Другие СУБД 1 22.07.2011 13:16
Разработка приложений Lisska C++ Builder 1 08.06.2011 07:01
разработка флеш игр igoryan777 Компьютерные игры 1 09.12.2010 20:43
Разработка игр may_yuliya Компьютерные игры 0 16.09.2010 21:26
Разработка компонент KVL Delphi 2 06.05.2010 10:28
Разработка программ ProCodeService Работа 0 08.04.2009 15:03
Разработка FireWall Dian Visual C++ 1 01.10.2004 09:21
Разработка игры Anonymous Некоммерческие проекты 1 17.09.2004 15:41
Разработка - СУБД fdb Алексеев Николай Некоммерческие проекты 1 27.08.2004 02:23
Разработка БД на заказ Улисс Работа 0 20.08.2004 12:19
Разработка ПО и спецвычислителей SergeySS Работа 0 17.08.2004 17:29



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов