Создал шаблон 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 & 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
]
Можно ли (и нужно ли) бороться с этим предупреждением, если можно и нужно то как?
Спасибо.
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>
Pete Becker, один из разработчиков того STL, что поставлялся с VC 6, на эту
статью сильно ругался Вери, говорит, мислидинь статейка, и на кой чорт ее
только написали. На самом деле, если тебе надо под VC 6, следует взять
апдейт его стля (раньше был на сайте динкумваре, есть и на рсдн) и перестать
обращать внимание на warning C4251. Под VC 7.1 — апдейт брать не надо,
ворнинг игнорировать.
With best regards, Sergey.
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, 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 и побольше и понекрасивше...
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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Sergey, Вы писали:
S>Оба модуля собираются в дебаге с опцией /MDd, а в релизе — /MD ? Или рантайм S>сттически линкуется?
Это уже из области фантастики, как обычно... почитал здесь, понял что должно всё работать, перекомпилировал — точно работает и release и debug при любом раскладе предупреждений...