Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos g++;4.2.1:-O断开与模板函数的链接_Macos_Templates_Linker_G++_Linker Errors - Fatal编程技术网

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

Macos g++;4.2.1:-O断开与模板函数的链接,macos,templates,linker,g++,linker-errors,Macos,Templates,Linker,G++,Linker Errors,下面的g++main.cf.c适用于g++-4.2.1,但 g++-O3 main.cf.c发出警告 /usr/libexec/gcc/powerpc-apple-darwin8/4.2.1/ld:未定义的符号: 整数f(整数常数*) collect2:ld返回了1个退出状态 //main.c 模板 int f(常数T*A); int main() { int*A=新的int[10]; int ftemplate=f(A); } //f.c 模板 整数f(常数T*A) {返回一个[0]; } i

下面的
g++main.cf.c
适用于g++-4.2.1,但
g++-O3 main.cf.c
发出警告

/usr/libexec/gcc/powerpc-apple-darwin8/4.2.1/ld:未定义的符号:
整数f(整数常数*)
collect2:ld返回了1个退出状态
//main.c
模板
int f(常数T*A);
int main()
{
int*A=新的int[10];
int ftemplate=f(A);
}
//f.c
模板
整数f(常数T*A)
{返回一个[0];
}
int call_f()
{int*A=新的int[10];
返回f(A);//此处为ok,但不从main()返回
}
在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上 (来自),
普通
g++*.c
有效,
g++-O*.c
给出相同的
ld:未定义的符号
错误。
可能是一个bug g++old/usr/bin/ld?更可能是我做了傻事


有人能帮忙吗,或者看看这在非Mac上是否有效?谢谢

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

这包括主呼叫


它可能在未优化的构建中工作,因为编译器为隐式函数模板实例化发出导出的函数定义符号。C++标准允许编译器省略它,GCC在这里进行优化构建(可能只是调用了,然后定义符号就不再使用)。除非您显式实例化函数调用中函数调用的函数模板,您必须使函数模板定义对其调用者可见

这包括主呼叫


它可能在未优化的构建中工作,因为编译器为隐式函数模板实例化发出导出的函数定义符号。C++标准允许编译器省略它,而GCC在这里进行优化构建(可能是内嵌调用,然后定义符号就不被使用了。

拇指一般规则:你不使用<代码> -O3。@ H2CO3,好,但这不是问题:10.7,-O2也不起作用。为什么它要破坏链接器?它不应该破坏。我怀疑这是一个编译器错误。一般的经验法则:你不使用
-O3
@H2CO3,好吧,但这不是问题:在10.7上,-O2也不起作用。为什么它要破坏链接器?它不应该破坏。我怀疑这是一个编译器错误。谢谢——我的误解,重复的等等,但令人困惑,因为它有时会工作。它并不总是错的。您可以限制可用的类型,并为这些类型显式实例化模板。您能告诉我更多信息吗:我如何说例如template?(在今天的g++中,不是c++11)你最好把这个问题作为一个新的stackoverflow问题来问谢谢——我的误解,重复的等等,但令人困惑,因为它有时会起作用。它并不总是错的。您可以限制可用的类型,并为这些类型显式实例化模板。您能告诉我更多信息吗:我如何说例如template?(在今天的g++中,不是c++11)您最好将此作为一个新的问题来问