extern void MyInitFunc(void) __attribute__ ((constructor));
extern void MyTermFunc(void) __attribute__ ((destructor));
void MyInitFunc(void)
{
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
}
void MyTermFunc(void)
{
}
我把它放在主应用程序(不是库或框架)中的.c文件中。根据GCC文档,它不会被调用。我错过了重要的事吗?这是在Snow Leopard的XCode 3.2上。
答案 0 :(得分:9)
这可能解释了Snow Leopard上报告的一些奇怪错误,但前提是这个结构在早期版本中有效。
你是正确的MyInitFunc
应该纯粹是因为与程序链接而被调用,即使程序是普通的C89,即使其余部分完全是其他语言。
问题是系统上的C启动代码没有查看.ctors
部分和.dtors
部分的构造函数和析构函数的地址。我不确定这是否适用于所有平台,但通常这是__do_global_ctors
,libgcc
的一部分。
这是一个平台错误,或者,你的gcc构建错误,或者,Apple只是决定以不同的方式做事,gcc不能正确支持该平台。
您可以尝试cc -v ...
并检查是否正在调用collect2
而不是ld
。
答案 1 :(得分:3)
(a)您的代码适用于我在Xcode 3.2中编译和运行SnowLeopard。
(b)我不确定何时确保设置了stdout。你在main之前运行代码。为什么不在这里更新全局变量,然后在main中打印出来以查看代码是否已运行。