g++ main.c f.c
适用于g ++ - 4.2.1,但是
g++ -O3 main.c f.c
发出警告
/usr/libexec/gcc/powerpc-apple-darwin8/4.2.1/ld: Undefined symbols:
int f<int>(int const*)
collect2: ld returned 1 exit status
// main.c
template <typename T>
int f( const T* A );
int main()
{
int* A = new int[10];
int ftemplate = f( A );
}
// f.c
template <typename T>
int f( const T* A )
{ return A[0];
}
int call_f()
{ int* A = new int[10];
return f( A ); // ok here but not from main()
}
on macosx 10.4.11 powerpc-apple-darwin8-g ++ - 4.2.1(GCC)4.2.1(Apple Inc. build 5564),
-O2
有效,-O3
没有
在macosx上10.7.4 i686-apple-darwin11-llvm-g ++ - 4.2
(来自https://github.com/kennethreitz/osx-gcc-installer),
普通g++ *.c
有效,g++ -O *.c
会出现相同的ld: Undefined symbols
错误
也许是一个bug g ++&lt; - &gt;旧/ usr / bin / ld?我更有可能做了一些愚蠢的事......
任何人都可以提供帮助,或者看看这是否适用于非Mac?谢谢!
答案 0 :(得分:1)
除非您为函数调用中使用的参数显式实例化函数模板,否则必须使函数模板定义对其调用者可见。
这包括主要的电话。
它可能在未优化的构建中起作用,因为编译器为隐式函数模板实例化发出导出的函数定义符号。 C ++标准允许编译器省略这样做,GCC在此处进行优化构建(可能只是内联调用,然后定义符号变为未使用)。