как экспортировать std::vector из DLL
От: opendx  
Дата: 28.03.05 08:38
Оценка:
Создал шаблон DLL в Visual Studio .NET, добавил в класс одну строчку vector<int> vi; и полчил неприятное предупреждение:

h:\c\dlltest\dlltest.h(20) : warning C4251: 'Cdlltest::vi' : class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'Cdlltest'
        with
        [
            _Ty=int
        ]


Почитал тут: How To Exporting STL Components Inside &amp; Outside of a Class но реально это работает только с VC6.
Если я добавляю explicit instantiation: template class __declspec(dllexport) vector<int>, как рекомендовано, перед определением класса, то получаю более замысловатое предупреждение в VC7.1:

c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\vector(35) : warning C4251: 'std::_Vector_val<_Ty,_Alloc>::_Alval' : class 'std::allocator<_Ty>' needs to have dll-interface to be used by clients of class 'std::_Vector_val<_Ty,_Alloc>'
        with
        [
            _Ty=int,
            _Alloc=std::allocator<int>
        ]
        and
        [
            _Ty=int
        ]
        and
        [
            _Ty=int,
            _Alloc=std::allocator<int>
        ]
        h:\c\dlltest\dlltest.h(15) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
        with
        [
            _Ty=int
        ]

Можно ли (и нужно ли) бороться с этим предупреждением, если можно и нужно то как?
Спасибо.
Re: как экспортировать std::vector из DLL
От: Sergey Россия  
Дата: 28.03.05 09:05
Оценка:
Hello, opendx!
You wrote on Mon, 28 Mar 2005 08:38:49 GMT:

o> Создал шаблон DLL в Visual Studio .NET, добавил в класс одну строчку

o> vector<int> vi; и полчил неприятное предупреждение:

o>
 o> h:\c\dlltest\dlltest.h(20) : warning C4251: 'Cdlltest::vi' : class
 o> 'std::vector<_Ty>' needs to have dll-interface to be used by clients of
 o> class 'Cdlltest'
 o>         with
 o>         [
 o>             _Ty=int
 o>         ]
 o>


Это предупреждение надлежит давить прагмой

o> Почитал тут:

o> How<br />
<span class='lineQuote level1'> o&gt; To Exporting STL Components Inside &amp; Outside of a Class</span>
но реально

o> это работает только с VC6.

Pete Becker, один из разработчиков того STL, что поставлялся с VC 6, на эту
статью сильно ругался Вери, говорит, мислидинь статейка, и на кой чорт ее
только написали. На самом деле, если тебе надо под VC 6, следует взять
апдейт его стля (раньше был на сайте динкумваре, есть и на рсдн) и перестать
обращать внимание на warning C4251. Под VC 7.1 — апдейт брать не надо,
ворнинг игнорировать.


With best regards, Sergey.
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: как экспортировать std::vector из DLL
От: opendx  
Дата: 28.03.05 10:55
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Hello, opendx!

S>You wrote on Mon, 28 Mar 2005 08:38:49 GMT:

o>> Создал шаблон DLL в Visual Studio .NET, добавил в класс одну строчку

o>> vector<int> vi; и полчил неприятное предупреждение:

o>>
 o>> h:\c\dlltest\dlltest.h(20) : warning C4251: 'Cdlltest::vi' : class
 o>> 'std::vector<_Ty>' needs to have dll-interface to be used by clients of
 o>> class 'Cdlltest'
 o>>         with
 o>>         [
 o>>             _Ty=int
 o>>         ]
 o>>


S>Это предупреждение надлежит давить прагмой


S>Pete Becker, один из разработчиков того STL, что поставлялся с VC 6, на эту

S>статью сильно ругался Вери, говорит, мислидинь статейка, и на кой чорт ее
S>только написали. На самом деле, если тебе надо под VC 6, следует взять
S>апдейт его стля (раньше был на сайте динкумваре, есть и на рсдн) и перестать
S>обращать внимание на warning C4251. Под VC 7.1 — апдейт брать не надо,
S>ворнинг игнорировать.

Попробовал проигнорировать. В VC 7.1. При попытке использовать вектор
Cdlltest dllt;
dllt.vi.push_back( 3 );
сразу же вылет
HEAP[usedll.exe]: Invalid Address specified to RtlValidateHeap( 00370000, 003D4F10 )
при закрытии простейшего тестового приложения. Если же оставить explicit instantiation и
игнорировать второй warning, то кажется хотя-бы работает, хоть warning и побольше и понекрасивше...
Re[3]: как экспортировать std::vector из DLL
От: Sergey Россия  
Дата: 28.03.05 11:04
Оценка:
Hello, opendx!
You wrote on Mon, 28 Mar 2005 10:55:34 GMT:

o> Попробовал проигнорировать. В VC 7.1. При попытке использовать вектор

o> Cdlltest dllt;
o> dllt.vi.push_back( 3 );
o> сразу же вылет
o> HEAP[usedll.exe]: Invalid Address specified to RtlValidateHeap(
o> 00370000, 003D4F10 ) при закрытии простейшего тестового приложения.

Оба модуля собираются в дебаге с опцией /MDd, а в релизе — /MD ? Или рантайм
сттически линкуется?

o> Если же оставить explicit instantiation и игнорировать второй warning,

o> то кажется хотя-бы работает, хоть warning и побольше и понекрасивше...

Но суть у него ровно та же, только ругается не на вектор, а на аллокатор.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: как экспортировать std::vector из DLL
От: opendx  
Дата: 28.03.05 16:53
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Оба модуля собираются в дебаге с опцией /MDd, а в релизе — /MD ? Или рантайм

S>сттически линкуется?

Это уже из области фантастики, как обычно... почитал здесь, понял что должно всё работать, перекомпилировал — точно работает и release и debug при любом раскладе предупреждений...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.