如何让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
。