public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
* Undefined reference to template function ...
@ 2011-05-30  8:32 Her, Il
  2011-05-31  8:53 ` Ian Lance Taylor
  0 siblings, 1 reply; 8+ messages in thread
From: Her, Il @ 2011-05-30  8:32 UTC (permalink / raw)
  To: gcc-help


Hello, gcc-help.

I experienced "undefined reference to template function ." when I am compiling my program
with gcc 4.1.2. 

Almost everyone says 
that's because template functions weren't be implemented in the same unit where they are
prototyped. (I used .cpp file for implementation and .h file for declaration).

But, It works if I use gcc 3.4.6 compiler without any change of options.
Why is this happening?...
I am working with my customer, I can't make them understand the common rule for using template
because it works on gcc 3.4.6.

Can you explain this situation to me? 
(Something like it is changed after 4.0 or you have any options to avoid this.)

Please, help me.

Thank you.

Her, Il
Technology Consulting
Technology Service Korea

TEL  : +82-2-2199-4475
Mobile : +82-10-4765-5597
il.her@hp.com


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Undefined reference to template function ...
  2011-05-30  8:32 Undefined reference to template function Her, Il
@ 2011-05-31  8:53 ` Ian Lance Taylor
  2011-05-31 12:21   ` Her, Il
  0 siblings, 1 reply; 8+ messages in thread
From: Ian Lance Taylor @ 2011-05-31  8:53 UTC (permalink / raw)
  To: Her, Il; +Cc: gcc-help

"Her, Il" <il.her@hp.com> writes:

> I experienced "undefined reference to template function ." when I am compiling my program
> with gcc 4.1.2. 
>
> Almost everyone says 
> that's because template functions weren't be implemented in the same unit where they are
> prototyped. (I used .cpp file for implementation and .h file for declaration).
>
> But, It works if I use gcc 3.4.6 compiler without any change of options.
> Why is this happening?...
> I am working with my customer, I can't make them understand the common rule for using template
> because it works on gcc 3.4.6.
>
> Can you explain this situation to me? 
> (Something like it is changed after 4.0 or you have any options to avoid this.)

It's impossible to give you a precise answer without a small example.

You may find it helpful to read
http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Template-Instantiation.html

Ian

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: Undefined reference to template function ...
  2011-05-31  8:53 ` Ian Lance Taylor
@ 2011-05-31 12:21   ` Her, Il
  2011-05-31 12:44     ` Axel Freyn
  2011-05-31 15:29     ` Ian Lance Taylor
  0 siblings, 2 replies; 8+ messages in thread
From: Her, Il @ 2011-05-31 12:21 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: gcc-help


Thank you for answering my question.
Here is my sample.

[Test.h]
#ifndef __TEST_hh
#define __TEST_hh
struct TEST
{
	int a, b;
};
#endif

[sub.h]
#include <stdio.h>
template <typename T> struct Base
{
	void dump(T &r);
	int fn(int a, int b);
};

[sub.cpp]
#include "sub.h"

template<typename T> void Base<T>::dump(T &r)
{
}

template<typename T> int Base<T>::fn(int a, int b);
{
	return 0;
}

[main.cpp]
#include <stdio.h>
#include "sub.h"
#include "TEST.h"

int main()
{
	Base<TEST> t;
	TEST x;

	t.dump(x);
	t.fn(1, 2);
}

** Result of compiling
[test@test-1] $ g++ -c -dynamic sub.cpp
[test@test-1] $ g++ -shared -o libsub.so sub.o
[test@test-1] $ g++ -g -W -o main main.cpp -lsub -L./
/tmp/ccaUlqlQ.o: In function `main`:
/home/guinsa/main.cpp:10: undefined reference to `Base<TEST>::dump(TEST&)`
/home/guinsa/main.cpp:11: undefined reference to `Base<TEST>::fn(int, int)`
collect2: ld returned 1 exit status


Please, help me to solve this.
Thank you.


Her, Il
Technology Consulting
Technology Service Korea

TEL  : +82-2-2199-4475
Mobile : +82-10-4765-5597
il.her@hp.com

-----Original Message-----
From: Ian Lance Taylor [mailto:iant@google.com] 
Sent: Tuesday, May 31, 2011 2:49 PM
To: Her, Il
Cc: gcc-help@gcc.gnu.org
Subject: Re: Undefined reference to template function ...

"Her, Il" <il.her@hp.com> writes:

> I experienced "undefined reference to template function ." when I am compiling my program
> with gcc 4.1.2. 
>
> Almost everyone says 
> that's because template functions weren't be implemented in the same unit where they are
> prototyped. (I used .cpp file for implementation and .h file for declaration).
>
> But, It works if I use gcc 3.4.6 compiler without any change of options.
> Why is this happening?...
> I am working with my customer, I can't make them understand the common rule for using template
> because it works on gcc 3.4.6.
>
> Can you explain this situation to me? 
> (Something like it is changed after 4.0 or you have any options to avoid this.)

It's impossible to give you a precise answer without a small example.

You may find it helpful to read
http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Template-Instantiation.html

Ian

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Undefined reference to template function ...
  2011-05-31 12:21   ` Her, Il
@ 2011-05-31 12:44     ` Axel Freyn
  2011-05-31 15:29     ` Ian Lance Taylor
  1 sibling, 0 replies; 8+ messages in thread
From: Axel Freyn @ 2011-05-31 12:44 UTC (permalink / raw)
  To: gcc-help

Hi,

On Tue, May 31, 2011 at 05:59:40AM +0000, Her, Il wrote:
> From: Ian Lance Taylor [mailto:iant@google.com] 
>> "Her, Il" <il.her@hp.com> writes:
>> 
>>> I experienced "undefined reference to template function ." when I am
>>> compiling my program with gcc 4.1.2. 
>>>
>>> Almost everyone says that's because template functions weren't be
>>> implemented in the same unit where they are prototyped. (I used .cpp
>>> file for implementation and .h file for declaration).
>>>
>>> But, It works if I use gcc 3.4.6 compiler without any change of
>>> options.  Why is this happening?...
>>> I am working with my customer, I can't make them understand the
>>> common rule for using template because it works on gcc 3.4.6.
>>>
>>> Can you explain this situation to me? 
>>> (Something like it is changed after 4.0 or you have any options to avoid this.)
>> 
>> It's impossible to give you a precise answer without a small example.
>> 
>> You may find it helpful to read
>> http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Template-Instantiation.html
> 
> [...]
> 
> ** Result of compiling
> [test@test-1] $ g++ -c -dynamic sub.cpp
> [test@test-1] $ g++ -shared -o libsub.so sub.o
> [test@test-1] $ g++ -g -W -o main main.cpp -lsub -L./
> /tmp/ccaUlqlQ.o: In function `main`:
> /home/guinsa/main.cpp:10: undefined reference to `Base<TEST>::dump(TEST&)`
> /home/guinsa/main.cpp:11: undefined reference to `Base<TEST>::fn(int, int)`
> collect2: ld returned 1 exit status

To my knowledge it's impossible. You want to compile a library which
contains the "template code", and which is fully independent of the
type TEST for which you instantiate the template Base<...>.
If that would be possible, we could rewrite the complete C++ standard
library and compile it into a shared library :-)

I think, you have two ways to solve it:
1) really include also the template implementations in "sub.cpp" into
   main.cpp

2) Instantiate explicitely the necessary templates.
   In your example, you would need a line
template class Base<TEST>;
   somewhere in a file which includes the implementations.

You could e.g. add to sub.cpp the two lines (it's not necessary to
include TEST.h)

struct TEST;
template class Base<TEST>;

or generate a special "template instantiation library"  (as proposed on
http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Template-Instantiation.html).

Axel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Undefined reference to template function ...
  2011-05-31 12:21   ` Her, Il
  2011-05-31 12:44     ` Axel Freyn
@ 2011-05-31 15:29     ` Ian Lance Taylor
  2011-06-01  1:03       ` Her, Il
  1 sibling, 1 reply; 8+ messages in thread
From: Ian Lance Taylor @ 2011-05-31 15:29 UTC (permalink / raw)
  To: Her, Il; +Cc: gcc-help

"Her, Il" <il.her@hp.com> writes:

> Thank you for answering my question.
> Here is my sample.
>
> [Test.h]
> #ifndef __TEST_hh
> #define __TEST_hh
> struct TEST
> {
> 	int a, b;
> };
> #endif
>
> [sub.h]
> #include <stdio.h>
> template <typename T> struct Base
> {
> 	void dump(T &r);
> 	int fn(int a, int b);
> };
>
> [sub.cpp]
> #include "sub.h"
>
> template<typename T> void Base<T>::dump(T &r)
> {
> }
>
> template<typename T> int Base<T>::fn(int a, int b);
> {
> 	return 0;
> }
>
> [main.cpp]
> #include <stdio.h>
> #include "sub.h"
> #include "TEST.h"
>
> int main()
> {
> 	Base<TEST> t;
> 	TEST x;
>
> 	t.dump(x);
> 	t.fn(1, 2);
> }
>
> ** Result of compiling
> [test@test-1] $ g++ -c -dynamic sub.cpp
> [test@test-1] $ g++ -shared -o libsub.so sub.o
> [test@test-1] $ g++ -g -W -o main main.cpp -lsub -L./
> /tmp/ccaUlqlQ.o: In function `main`:
> /home/guinsa/main.cpp:10: undefined reference to `Base<TEST>::dump(TEST&)`
> /home/guinsa/main.cpp:11: undefined reference to `Base<TEST>::fn(int, int)`
> collect2: ld returned 1 exit status


In your earlier message you said that you had code that worked with gcc
3.4.6 but failed with gcc 4.1.2.  Does this test case work with gcc
3.4.6?

Ian

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: Undefined reference to template function ...
  2011-05-31 15:29     ` Ian Lance Taylor
@ 2011-06-01  1:03       ` Her, Il
  2011-06-01  8:45         ` Axel Freyn
  0 siblings, 1 reply; 8+ messages in thread
From: Her, Il @ 2011-06-01  1:03 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: gcc-help



Yes, it is compiled well with gcc 3.4.6,
but it doesn't work with gcc 4.1.2


thank you

Her, Il
Technology Consulting
Technology Service Korea

TEL  : +82-2-2199-4475
Mobile : +82-10-4765-5597
il.her@hp.com

-----Original Message-----
From: Ian Lance Taylor [mailto:iant@google.com] 
Sent: Tuesday, May 31, 2011 10:51 PM
To: Her, Il
Cc: gcc-help@gcc.gnu.org
Subject: Re: Undefined reference to template function ...

"Her, Il" <il.her@hp.com> writes:

> Thank you for answering my question.
> Here is my sample.
>
> [Test.h]
> #ifndef __TEST_hh
> #define __TEST_hh
> struct TEST
> {
> 	int a, b;
> };
> #endif
>
> [sub.h]
> #include <stdio.h>
> template <typename T> struct Base
> {
> 	void dump(T &r);
> 	int fn(int a, int b);
> };
>
> [sub.cpp]
> #include "sub.h"
>
> template<typename T> void Base<T>::dump(T &r)
> {
> }
>
> template<typename T> int Base<T>::fn(int a, int b);
> {
> 	return 0;
> }
>
> [main.cpp]
> #include <stdio.h>
> #include "sub.h"
> #include "TEST.h"
>
> int main()
> {
> 	Base<TEST> t;
> 	TEST x;
>
> 	t.dump(x);
> 	t.fn(1, 2);
> }
>
> ** Result of compiling
> [test@test-1] $ g++ -c -dynamic sub.cpp
> [test@test-1] $ g++ -shared -o libsub.so sub.o
> [test@test-1] $ g++ -g -W -o main main.cpp -lsub -L./
> /tmp/ccaUlqlQ.o: In function `main`:
> /home/guinsa/main.cpp:10: undefined reference to `Base<TEST>::dump(TEST&)`
> /home/guinsa/main.cpp:11: undefined reference to `Base<TEST>::fn(int, int)`
> collect2: ld returned 1 exit status


In your earlier message you said that you had code that worked with gcc
3.4.6 but failed with gcc 4.1.2.  Does this test case work with gcc
3.4.6?

Ian

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Undefined reference to template function ...
  2011-06-01  1:03       ` Her, Il
@ 2011-06-01  8:45         ` Axel Freyn
  2011-06-01 13:23           ` Ian Lance Taylor
  0 siblings, 1 reply; 8+ messages in thread
From: Axel Freyn @ 2011-06-01  8:45 UTC (permalink / raw)
  To: Her, Il; +Cc: Ian Lance Taylor, gcc-help

Hi

On Wed, Jun 01, 2011 at 01:03:03AM +0000, Her, Il wrote:
> Yes, it is compiled well with gcc 3.4.6,
> but it doesn't work with gcc 4.1.2

Strange -- I just tried with 3.4.6 on x86_64, configured as
../gcc-3.4.6/configure --prefix=/tmp/gcc_test/install --disable-multilib
Thread model: posix
gcc version 3.4.6

your testcase gives  (after removing the erroneous ";" in sub.cpp )

/tmp/ccGJf1zv.o: In function `main': 
/tmp/gcc_test/main.cpp:9: undefined reference to `Base<TEST>::dump(TEST&)'
/tmp/gcc_test/main.cpp:10: undefined reference to `Base<TEST>::fn(int, int)'
collect2: ld returned 1 exit status

(however, I did compile without the flag "-dynamic", which is only vaild
on darwin. But according to the docs, "-dynamic" is a flag for the
linker - so I don't see how it would influence the template
instantiation....)


Axel

> 
> 
> thank you
> 
> Her, Il
> Technology Consulting
> Technology Service Korea
> 
> TEL  : +82-2-2199-4475
> Mobile : +82-10-4765-5597
> il.her@hp.com
> 
> -----Original Message-----
> From: Ian Lance Taylor [mailto:iant@google.com] 
> Sent: Tuesday, May 31, 2011 10:51 PM
> To: Her, Il
> Cc: gcc-help@gcc.gnu.org
> Subject: Re: Undefined reference to template function ...
> 
> "Her, Il" <il.her@hp.com> writes:
> 
> > Thank you for answering my question.
> > Here is my sample.
> >
> > [Test.h]
> > #ifndef __TEST_hh
> > #define __TEST_hh
> > struct TEST
> > {
> > 	int a, b;
> > };
> > #endif
> >
> > [sub.h]
> > #include <stdio.h>
> > template <typename T> struct Base
> > {
> > 	void dump(T &r);
> > 	int fn(int a, int b);
> > };
> >
> > [sub.cpp]
> > #include "sub.h"
> >
> > template<typename T> void Base<T>::dump(T &r)
> > {
> > }
> >
> > template<typename T> int Base<T>::fn(int a, int b);
> > {
> > 	return 0;
> > }
> >
> > [main.cpp]
> > #include <stdio.h>
> > #include "sub.h"
> > #include "TEST.h"
> >
> > int main()
> > {
> > 	Base<TEST> t;
> > 	TEST x;
> >
> > 	t.dump(x);
> > 	t.fn(1, 2);
> > }
> >
> > ** Result of compiling
> > [test@test-1] $ g++ -c -dynamic sub.cpp
> > [test@test-1] $ g++ -shared -o libsub.so sub.o
> > [test@test-1] $ g++ -g -W -o main main.cpp -lsub -L./
> > /tmp/ccaUlqlQ.o: In function `main`:
> > /home/guinsa/main.cpp:10: undefined reference to `Base<TEST>::dump(TEST&)`
> > /home/guinsa/main.cpp:11: undefined reference to `Base<TEST>::fn(int, int)`
> > collect2: ld returned 1 exit status
> 
> 
> In your earlier message you said that you had code that worked with gcc
> 3.4.6 but failed with gcc 4.1.2.  Does this test case work with gcc
> 3.4.6?
> 
> Ian

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Undefined reference to template function ...
  2011-06-01  8:45         ` Axel Freyn
@ 2011-06-01 13:23           ` Ian Lance Taylor
  0 siblings, 0 replies; 8+ messages in thread
From: Ian Lance Taylor @ 2011-06-01 13:23 UTC (permalink / raw)
  To: Her, Il, Ian Lance Taylor, gcc-help

On Wed, Jun 1, 2011 at 1:44 AM, Axel Freyn <axel-freyn@gmx.de> wrote:
> Hi
>
> On Wed, Jun 01, 2011 at 01:03:03AM +0000, Her, Il wrote:
>> Yes, it is compiled well with gcc 3.4.6,
>> but it doesn't work with gcc 4.1.2
>
> Strange -- I just tried with 3.4.6 on x86_64, configured as
> ../gcc-3.4.6/configure --prefix=/tmp/gcc_test/install --disable-multilib
> Thread model: posix
> gcc version 3.4.6
>
> your testcase gives  (after removing the erroneous ";" in sub.cpp )
>
> /tmp/ccGJf1zv.o: In function `main':
> /tmp/gcc_test/main.cpp:9: undefined reference to `Base<TEST>::dump(TEST&)'
> /tmp/gcc_test/main.cpp:10: undefined reference to `Base<TEST>::fn(int, int)'
> collect2: ld returned 1 exit status

I just did the same thing on x86_64-unknown-linux-gnu, with the same results.

Looking at the code, I don't see how the results could be anything
else.  You need
to force the template expansion to occur as described on the web page
referenced earlier on the thread.

Also looking at the code, it did not compile, due to the extra semicolon, and I
had to change main.cpp to #include "test.h" rather than "TEST.h".  So I don't
think you tested the exact code you showed us with gcc 3.4.6.

Ian

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2011-06-01 13:23 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-30  8:32 Undefined reference to template function Her, Il
2011-05-31  8:53 ` Ian Lance Taylor
2011-05-31 12:21   ` Her, Il
2011-05-31 12:44     ` Axel Freyn
2011-05-31 15:29     ` Ian Lance Taylor
2011-06-01  1:03       ` Her, Il
2011-06-01  8:45         ` Axel Freyn
2011-06-01 13:23           ` Ian Lance Taylor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).