From: Wheeler, F. (Research) <wh...@cr...> - 2002-10-28 16:29:47
|
I think I know how to fix this problem, but it would involve changing aclocal.m4, so I'd like to hear whether others think I'm on the right track or not. RIGHT TO THE POINT: I think that removing the following 3 lines from aclocal.m4 (they only occur once in that file) is the right thing to do. #ifdef __GNUC__ #pragma interface #endif If anyone agrees, and nobody has a better plan, I'll commit the change. THE DETAILS: I accidentally found out that these "non-template used as template" errors go away when I use gcc 3.2 if I use the configuration headers produced with gcc 2.95.3. Of the few configuration differences between gcc 2.95.3 and gcc 3.2, this one caught my attention: VCL_NEEDS_INLINE_INSTANTIATION setting platform ------- -------- 0 my cygwin gcc 2.95.3 1 my cygwin gcc 3.2 0 dashboard OSF gcc 3.2 Sure enough, the error goes away for gcc 3.2 when I change VCL_NEEDS_INLINE_INSTANTIATION from 1 to 0. But, why would my gcc 3.2 get a different value than the OSF gcc 3.2? The following is the program that autoconf tries to compile and link to set VCL_NEEDS_INLINE_INSTANTIATION. #ifdef __GNUC__ #pragma interface #endif template <class T> inline T dot(T const *a, T const *b) { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; } //template double dot(double const *, double const *); int function(); int call_this() { function(); return 0; } int function() { double a[3] = {1.0, 2.0, 3.0}; double b[3] = {4.0, 5.0, 6.0}; double a_b = dot(a, b); return int(a_b); } // If the program links, the compiler inlined the function template. #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } The use of #pragma interface seems to prevent linking with gcc 3.2. The above program compiles and links with 2.95.3, but 3.2 gives this message: /usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../libcygwin.a(libcmain.o)(.text+0x7c): undefined reference to `_WinMain@16' collect2: ld returned 1 exit status Removing the #pragma interface, or prepending a #pragma implementation, make the program link perfectly. Perhaps the #pragma interface now prevents emission of main()? One question remains: why does the OSF gcc 3.2 dashboard build correctly have VCL_NEEDS_INLINE_INSTANTIATION set to 0? Fred Wheeler > -----Original Message----- > From: Wheeler, Fred (Research) > Sent: Monday, October 28, 2002 9:20 AM > To: VXL Maintainers List (E-mail) > Subject: [Vxl-maintainers] gcc 3.2 -- non-template used as template > > > I'm getting the error shown below a couple of dozen times in > vbl and vnl when compiling VXL with gcc > 3.2 in Cygwin. I see a relatively successful 3.2 build on > the dashboard so I'm a bit surprised. > Does anyone know what might be wrong offhand, before I dig > further into this? > > As of very recently, gcc 3.2 is the default gcc for Cygwin. > I just completely wiped my gcc 2.95.3 > build and started over, substituting only the gcc and g++ versions. > > Thanks, > Fred Wheeler > > /usr/bin/g++ -Wall -g -O2 -I/home/wheeler/work_vxl/vxl_src/vxl/vbl > -I/home/wheeler/work_vxl/vxl_bld_cyg/vcl > -I/home/wheeler/work_vxl/vxl_bld_cyg/vxl > -I/home/wheeler/work_vxl/vxl_src/vcl > -I/home/wheeler/work_vxl/vxl_src/vxl -DVXL_WARN_DEPRECATED > -DVXL_WARN_DEPRECATED_ONCE -c > /home/wheeler/work_vxl/vxl_src/vxl/vbl/Templates/vbl_sparse_ar > ray_1d+double-.cxx -o > Templates/vbl_sparse_array_1d+double-.o > /home/wheeler/work_vxl/vxl_src/vxl/vbl/Templates/vbl_sparse_ar > ray_1d+double-.cxx:2: non-template > used as template > > -- > Fred Wheeler, GE CRD, KWC-303 > Phone: 518-387-7225 (GE Internal Dialcom: 8*833-7225) > Fax: 518-387-4042 (GE Internal Dialcom: 8*833-4042) > > > ------------------------------------------------------- > This sf.net email is sponsored by:ThinkGeek > Welcome to geek heaven. > http://thinkgeek.com/sf > _______________________________________________ > Vxl-maintainers mailing list > Vxl...@li... > https://lists.sourceforge.net/lists/listinfo/vxl-maintainers > |
From: Wheeler, F. (Research) <wh...@cr...> - 2002-10-28 17:55:46
|
Amitha wrote: > The repository version of aclocal.m4 doesn't seem have the "main" > part. Did you add this for the test? I don't think it is necessary for > the TRY_LINK. The main() part is inserted by autoconf, you can see it in "configure". Fred Wheeler |
From: Amitha P. <pe...@cs...> - 2002-10-28 17:51:09
|
"Wheeler, Fred (Research)" <wh...@cr...> writes: > I think I know how to fix this problem, but it would involve changing aclocal.m4, so I'd like to hear > whether others think I'm on the right track or not. > > RIGHT TO THE POINT: > > I think that removing the following 3 lines from aclocal.m4 (they only occur once in that file) is > the right thing to do. > > #ifdef __GNUC__ > #pragma interface > #endif > > If anyone agrees, and nobody has a better plan, I'll commit the change. [...] > The use of #pragma interface seems to prevent linking with gcc 3.2. The above program compiles and > links with 2.95.3, but 3.2 gives this message: > > /usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../libcygwin.a(libcmain.o)(.text+0x7c): undefined reference > to `_WinMain@16' > collect2: ld returned 1 exit status > > Removing the #pragma interface, or prepending a #pragma implementation, make the program link > perfectly. Perhaps the #pragma interface now prevents emission of main()? There was a discussion about #pragma interface a while ago, and I think we decided to remove it. (Hence the use of VCL_NEEDS_PRAGMA_INTERFACE everywhere.) I think you can safely remove the 3 lines. According to the G++ man page, http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/C---Interface.html#C++%20Interface this way of specifing interfaces is in flux, so it's probably a good thing if we don't rely on it. Besides, it's not standard. :-) > // If the program links, the compiler inlined the function template. > #ifdef F77_DUMMY_MAIN > # ifdef __cplusplus > extern "C" > # endif > int F77_DUMMY_MAIN() { return 1; } > #endif > int > main () > { > > ; > return 0; > } The repository version of aclocal.m4 doesn't seem have the "main" part. Did you add this for the test? I don't think it is necessary for the TRY_LINK. Amitha. |
From: Peter V. <Pet...@es...> - 2002-10-29 22:12:12
|
> One question remains: why does the OSF gcc 3.2 dashboard build > correctly have VCL_NEEDS_INLINE_INSTANTIATION set to 0? The program (with the #pragma) compiles and links OK on OSF and Linux with gcc 3.2; apparently Cygwin does something strange with those #pragma's... But as was discussed before on this list, there is no need anymore (it seems) to use #pragma interface and #pragma implementation with gcc. -- Peter. |