dll собранные разными компилятора в одном проекте
От: sergey2b ЮАР  
Дата: 05.03.09 08:35
Оценка:
Подскажите пожалуйста могут ли быть какие либо проблеммы при использовании в одном проекте dlls собранных разными версиями visual studio

Приложение должно собираться vs2008 часть dll используемых приложением должно собираться в vs6 (при желании можно собрать в vs2003), одна в 2005
Собрать все в vs2005/2008 возможности нет так как в проекте используються lib и код расчитанный на vs6
dll собранные разными компилятора в одном проекте
От: Кодт Россия  
Дата: 05.03.09 14:59
Оценка: 21 (4)
#Имя: FAQ.cpp.dll.problems
Здравствуйте, sergey2b, Вы писали:

S>Подскажите пожалуйста могут ли быть какие либо проблеммы при использовании в одном проекте dlls собранных разными версиями visual studio


Проблем может быть дофигища самых разнообразных, поэтому лучше договориться — как избегать проблем.

Недекорированные имена.
Разные компиляторы декорируют по-разному, поэтому экспортировать/импортировать нужно, либо объявляя extern "C", либо вообще .def-файлами.
Естественно, что перегрузка здесь обламывается.

Менеджеры памяти (в составе CRT).
Не надеяться на то, что они общие для всех — даже компилируя с опциями "(Debug) (Multithreaded) DLL". Для разных версий компилятора рантаймы разные.
Поэтому никаких выделений памяти в одном месте и утилизации в другом — только всё своими силами.
Соответственно, библиотека, отдающая наружу свежесозданный объект (да хоть строку), должна использовать одну из техник:
— экспортировать функции утилизации
— протащить функцию утилизации через интерфейс объекта (например, COM — IUnknown::Release)
— использовать менеджер памяти ОС (например, COM — SysAllocString, CoTaskMemAlloc и т.д.)

Использовать стандартные конвенции — cdecl и stdcall. Всякие fastcall могут реализовываться по-разному даже у одного компилятора в зависимости от ключа оптимизации.

Если сишный API слишком узок, использовать COM. Необязательно, что это будет полноценный inproc server, можно и легковесные (без регистрации коклассов). Все виндоузные компиляторы совместимы с COM.
Более общий С++ный ООП не экспортировать — могут быть разные лэяуты, разные конвенции thiscall, дубликаты статических переменных...

Не кидать исключения за пределы своего модуля. Даже сквозь колбэк-функцию
typedef void F();
typedef void G(F);

void f()
{
    throw something;
}
void h(G g) // где G берётся из другого модуля
{
    try
    {
        g(f);
    }
    catch(something)
    {
    }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[2]: dll собранные разными компилятора в одном проекте
От: byleas  
Дата: 05.03.09 17:22
Оценка:
Здравствуйте, Кодт, Вы писали:

S>>собранных разными версиями visual studio

К>Разные компиляторы декорируют по-разному
А разве разные версии одного компилятора декорируют по-разному? undname, во всяком случае, понимает все имена, кроме декорированых с rvalue references, но их и сама студия 2010 не понимает
K> Не кидать исключения за пределы своего модуля
Почему?
Re[2]: dll собранные разными компилятора в одном проекте
От: sergey2b ЮАР  
Дата: 05.03.09 17:44
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Проблем может быть дофигища самых разнообразных, поэтому лучше договориться — как избегать проблем.


Спасибо за ваш ответ.
Скажите пожалуйста если есть выбор что лучше использовать vs6 или vs2003 для создания dll на C/C++
Re[3]: dll собранные разными компилятора в одном проекте
От: Кодт Россия  
Дата: 06.03.09 09:08
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>Скажите пожалуйста если есть выбор что лучше использовать vs6 или vs2003 для создания dll на C/C++


VC6 — довольно древний компилятор. Он и язык менее полно поддерживает, и ошибки содержит.
Но если ты не упираешься в эти ограничения — пожалуйста, пользуйся.
Хотя я бы предпочёл что-нибудь более новое.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: dll собранные разными компилятора в одном проекте
От: Кодт Россия  
Дата: 06.03.09 10:08
Оценка:
Здравствуйте, byleas, Вы писали:

K>> Не кидать исключения за пределы своего модуля

B>Почему?

Потому что "на той стороне" его должны обработать (как минимум, размотать стек).

Во-первых, исключение могут поймать. И это даёт почву для нарушения ODR — например, ты кидаешь std::logic_error, объявленный в твоей версии STL — а там ловят std::logic_error, объявленный в другой версии STL. Разные лэяуты, и привет.

Во-вторых, если тот код не собирается обрабатывать исключения (трактует твою функцию как не бросающую; а для extern"C"-функций есть такая опция компилятора), — это ситуация UB или terminate, сейчас затруднюсь сказать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: dll собранные разными компилятора в одном проекте
От: Аноним  
Дата: 06.03.09 13:26
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, Кодт, Вы писали:


S>Скажите пожалуйста если есть выбор что лучше использовать vs6 или vs2003 для создания dll на C/C++


я бы сказал, что лучше использовать vs2003 в любом случае, а не только "для создания dll"
Re[4]: dll собранные разными компилятора в одном проекте
От: sergey2b ЮАР  
Дата: 06.03.09 17:28
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>Скажите пожалуйста если есть выбор что лучше использовать vs6 или vs2003 для создания dll на C/C++


А>я бы сказал, что лучше использовать vs2003 в любом случае, а не только "для создания dll"


Чем он лучше в случаи C и pure C++ ?
Re: dll собранные разными компилятора в одном проекте
От: MasterZiv СССР  
Дата: 06.03.09 19:15
Оценка: 3 (1) -2 :)
sergey2b пишет:

> Подскажите пожалуйста могут ли быть какие либо проблеммы при

> использовании в одном проекте dlls собранных разными версиями visual studio

Тут все проблемы делятся на два случая:
-- ваши приложения используют C/С++ rumtime library
-- ваши приложения НЕ используют C/С++ rumtime library

Во втором случае всё гораздо легче. Собственно, во втором случае
вообще никаких проблем быть не должно.
В первом -- все модули (*.exe и *.dll) вашего приложения должны
использовать РОВНО ОДНУ И ТУ ЖЕ библиотеку C runtime library (CRTL).
CRTL от vc6 и vc2003/2005/8 несовместимы бинарно, на сколько я знаю.
Так что либо одно, либо другое (правда и тут есть нюансы, это запрещение
не фатальное, при желании и условиях оно обходится).


> Приложение должно собираться vs2008 часть dll используемых приложением

> должно собираться в vs6 (при желании можно собрать в vs2003), одна в 2005

Ну, тут ещё ничего не ясно, надо смотреть.
Posted via RSDN NNTP Server 2.1 beta
Re: dll собранные разными компилятора в одном проекте
От: MasterZiv СССР  
Дата: 06.03.09 19:17
Оценка: -1
Кодт пишет:
>

> Недекорированные имена.


При чём тут декорированные или недекорированные имена ?

> Если сишный API слишком узок, использовать COM. Необязательно, что это


И COM ?

Ужас. Ну и советы.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: dll собранные разными компилятора в одном проекте
От: MasterZiv СССР  
Дата: 06.03.09 19:22
Оценка:
sergey2b пишет:

> Спасибо за ваш ответ.

> Скажите пожалуйста если есть выбор что лучше использовать vs6 или vs2003
> для создания dll на C/C++

Что значит "что лучше" ? It epends, как говорится.
Исходя из того, что вы используете, и как, всё это будет очень
сильно разнится.

В топике вашем нет какой-то информации, которая бы позволяла
дать какие-то рекомендации, кроме той, что "лучше быть богатым
и здоровым, чем бедным и больным", т.е. что лучше писать на
vc2005/vc2008, а не на древнем уже vc6.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: dll собранные разными компилятора в одном проекте
От: sergey2b ЮАР  
Дата: 06.03.09 21:25
Оценка:
Здравствуйте, MasterZiv, Вы писали:

Спасибо за ваш ответ.

MZ>-- ваши приложения НЕ используют C/С++ rumtime library

как приложение или dll может не использовать rtl ?

MZ>В первом -- все модули (*.exe и *.dll) вашего приложения должны

MZ>использовать РОВНО ОДНУ И ТУ ЖЕ библиотеку C runtime library (CRTL).
MZ>CRTL от vc6 и vc2003/2005/8 несовместимы бинарно, на сколько я знаю.
MZ>Так что либо одно, либо другое (правда и тут есть нюансы, это запрещение
MZ>не фатальное, при желании и условиях оно обходится).

В моем случаи вприложение на pure C++, все dll написанны на чистом C, все исключения обрабатываються внутри dlls, в функции dll передаються простые параметры типо DWORD, char* возвращаеться DWORD.
Как в таком случаи различия версий rtl в dll могут повлиять?

>> Приложение должно собираться vs2008 часть dll используемых приложением

>> должно собираться в vs6 (при желании можно собрать в vs2003), одна в 2005

MZ>Ну, тут ещё ничего не ясно, надо смотреть.


В данный момент вся система написанна и компилица на VC6
планируеться сделать две версии системы x86 и x64
две dll из системы собираються с использованием чужих sdk lib и include которых расичтанны на VC6 (но я могу откомпилировать их в vc2003 с минимальными изменениями, в vc2005 собрать их неполучаеться)

Я планирую две dll испольузющие чужие sdk собирать VC6 или VC2003 (вопрос чем лучше VC2003 если код чистый Си возник потому что сборка на VC6 работает несколько лет без проблем что будет под VC2003 пока не известно)
остальные dll и само приложение планирую собирать vs2005/2008

Пока я могу выбирать компилятор (мотивировав чем одна версия VC лучше другой)

Совершенно не понятно и пока нет нормальных идей как из x64 я буду использовать x86 приложение.
Re[3]: dll собранные разными компилятора в одном проекте
От: MasterZiv СССР  
Дата: 07.03.09 10:33
Оценка:
sergey2b пишет:

> MZ>-- ваши приложения НЕ используют C/С++ rumtime library

> как приложение или dll может не использовать rtl ?

Да легко ! Хочет — использует, не хочет — не использует.
Кстати, тут тоже есть нюанс, здесь были сообщения, что от 2003
начиная не использовать CRT не получается: компилятор сам
генерирует какие-то вызовы. Поищите, если интересно.

> В моем случаи вприложение на pure C++, все dll написанны на чистом C,

> все исключения обрабатываються внутри dlls, в функции dll передаються
> простые параметры типо DWORD, char* возвращаеться DWORD.
> Как в таком случаи различия версий rtl в dll могут повлиять?

В таком случае всё гораздо легче, но всё равно может и повлиять.
При предачи любых объектов, выделенных в хипе, из одной .dll в другую
и последующем удалении в другой, уже в другом хипе. Другие проблемы
тоже могут быть. Вообще, там куча нюансов, которые могут смещать
возможность решения в ту или иную сторону. Если .dll-и изолированые,
т.е. её создатели предприняли спрец. меры к тому, чтобы библиотека
работала в любом компиляторе, или не используют CRTL, то всё гораздо легче.
Вам надо это самому смотреть и думать и решать.

>> > Приложение должно собираться vs2008 часть dll используемых приложением

>> > должно собираться в vs6 (при желании можно собрать в vs2003), одна в 2005

Лучше соберите всё в одном компиляторе. Если есть возможность.

> Совершенно не понятно и пока нет нормальных идей как из x64 я буду

> использовать x86 приложение.

Это я не знаю.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.