g ++ 4.2.1:-O断开与模板化函数的链接

时间:2012-11-20 17:19:55

标签: macos templates linker g++ linker-errors

下面的

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?谢谢!

1 个答案:

答案 0 :(得分:1)

除非您为函数调用中使用的参数显式实例化函数模板,否则必须使函数模板定义对其调用者可见。

这包括主要的电话。

它可能在未优化的构建中起作用,因为编译器为隐式函数模板实例化发出导出的函数定义符号。 C ++标准允许编译器省略这样做,GCC在此处进行优化构建(可能只是内联调用,然后定义符号变为未使用)。