digitalmars.D.bugs - separate compilation and repeated definitions
- Ben Hinkle (50/50) Dec 06 2004 I'm wondering how to work around a linking issue involving templates and...
- Sean Kelly (2/2) Dec 07 2004 This shouldn't happen. I would consider it a bug.
- Thomas Kuehne (15/64) Dec 12 2004 -----BEGIN PGP SIGNED MESSAGE-----
- Thomas Kuehne (10/26) Dec 12 2004 Just a word of warning:
I'm wondering how to work around a linking issue involving templates and separate compilation. I have three files temp1.d temp2.d and temp3.d: module temp1; struct Foo(T) { void set(T x) { y = x; } T y; } module temp2; import temp1; void t2() { Foo!(int)* x; x = new Foo!(int); x.set(10); } module temp3; import temp1; import temp2; void t3() { Foo!(int)* x; x = new Foo!(int); x.set(100); } int main() { t2(); t3(); return 0; } Now if I run dmd temp1.d temp2.d temp3.d then everything works fine. But if I run dmd -c temp1;d dmd -c temp2.d dmd -c temp3.d dmd temp1.obj temp2.obj temp3.obj I get: C:\d>dmd temp1.obj temp2.obj temp3.obj C:\dmd\bin\..\..\dm\bin\link.exe temp1+temp2+temp3,,,user32+kernel32/noi; OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved temp3.obj(temp3) Offset 001C7H Record Type 00C3 Error 1: Previous Definition Different : _D5temp15Foo_i3Foo3setFiZv --- errorlevel 1 Is this going to be a fact of life involving templates? Or is this a temporary state? I can redo my MinTL makefiles to always list everything on one command line when building unittests. I'm not sure if it will come up elsewhre. I'll have to check that none of my libraries contain template instantiations that could end up conflicting with user code. It basically makes separate compilation incompatible with templates unless you are very careful to never mix object files that could share a template instantiation. -Ben
Dec 06 2004
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Added to DStress: http://svn.kuehne.cn/dstress/complex/linking/ all 3 in one step: make complex/linking/linking_01 3 in 3 steps: make complex/linking/linking_02 Thomas Ben Hinkle schrieb am Mon, 6 Dec 2004 20:04:51 -0500:I'm wondering how to work around a linking issue involving templates and separate compilation. I have three files temp1.d temp2.d and temp3.d: module temp1; struct Foo(T) { void set(T x) { y = x; } T y; } module temp2; import temp1; void t2() { Foo!(int)* x; x = new Foo!(int); x.set(10); } module temp3; import temp1; import temp2; void t3() { Foo!(int)* x; x = new Foo!(int); x.set(100); } int main() { t2(); t3(); return 0; } Now if I run dmd temp1.d temp2.d temp3.d then everything works fine. But if I run dmd -c temp1;d dmd -c temp2.d dmd -c temp3.d dmd temp1.obj temp2.obj temp3.obj I get: C:\d>dmd temp1.obj temp2.obj temp3.obj C:\dmd\bin\..\..\dm\bin\link.exe temp1+temp2+temp3,,,user32+kernel32/noi; OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved temp3.obj(temp3) Offset 001C7H Record Type 00C3 Error 1: Previous Definition Different : _D5temp15Foo_i3Foo3setFiZv --- errorlevel 1 Is this going to be a fact of life involving templates? Or is this a temporary state? I can redo my MinTL makefiles to always list everything on one command line when building unittests. I'm not sure if it will come up elsewhre. I'll have to check that none of my libraries contain template instantiations that could end up conflicting with user code. It basically makes separate compilation incompatible with templates unless you are very careful to never mix object files that could share a template instantiation.-----BEGIN PGP SIGNATURE----- iD8DBQFBuuzz3w+/yD4P9tIRAqF9AKCI5u3jckObM5YN/e649Nchtt2skQCfSbgH WVQK1qbmQi5mImoYHPdGUjI= =C58c -----END PGP SIGNATURE-----
Dec 12 2004
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1Just a word of warning: GDC successfully compiles them separately, but fails on the combined invocation.. Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFBvMsk3w+/yD4P9tIRAs9FAKCGr08EE3ycewH4Vv+nef14zuRheQCgvY9W C2MFueVLNstEvqenobAg84A= =vfLw -----END PGP SIGNATURE-----Now if I run dmd temp1.d temp2.d temp3.d then everything works fine. But if I run dmd -c temp1;d dmd -c temp2.d dmd -c temp3.d dmd temp1.obj temp2.obj temp3.obj I get: C:\d>dmd temp1.obj temp2.obj temp3.obj C:\dmd\bin\..\..\dm\bin\link.exe temp1+temp2+temp3,,,user32+kernel32/noi; OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved temp3.obj(temp3) Offset 001C7H Record Type 00C3 Error 1: Previous Definition Different : _D5temp15Foo_i3Foo3setFiZv --- errorlevel 1
Dec 12 2004