如何让GCC __attribute __((构造函数))在OSX下工作?

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上。

(a)您的代码适用于我在Xcode 3.2中编译和运行SnowLeopard。

(b)我不确定何时确保设置了stdout。 你在main之前运行代码。 为什么不在这里更新全局变量,然后在main中打印出来以查看代码是否运行。

这可能解释了Snow Leopard上报告的一些奇怪的错误,但前提是这个结构在早期版本中有效。

你是正确的, MyInitFunc应该被纯粹作为与程序链接的结果调用,即使程序是普通的C89,即使其余部分完全是其他语言。

问题是你的系统上的C启动代码没有查看.ctors部分和.dtors部分的构造函数和析构函数的地址。 我不确定这是否适用于所有平台,但通常这是__do_global_ctors ,它是libgcc的一部分。

这是一个平台错误,或者,你的gcc构建错误,或者,Apple只是决定以不同的方式做事,而gcc不能正确支持该平台。

您可以尝试cc -v ...并检查是否正在直接调用collect2而不是ld