C++ ctor init不调用库中的全局ctor实例
我正在使用SourceryGpp lite for arm开发一个应用程序和一个库 我没有使用标准的libs或默认的开始文件。 因此,要调用全球CTR,我正在执行以下代码:C++ ctor init不调用库中的全局ctor实例,c++,assembly,constructor,arm,startup,C++,Assembly,Constructor,Arm,Startup,我正在使用SourceryGpp lite for arm开发一个应用程序和一个库 我没有使用标准的libs或默认的开始文件。 因此,要调用全球CTR,我正在执行以下代码: ldr r0,=__ctors_init__ ldr r0,[r0] mov lr,pc bx r0 所以问题是,我在静态库中定义了一些全局实例,但是上面的代码从未调用它们的构造函数。奇怪的是,应用程序的全局构造函数被成功调用,有人知道为什么吗?这是静态库和全局变量在运行时初始化时的一个众所周知的问题 大多数链接器只包含静
ldr r0,=__ctors_init__
ldr r0,[r0]
mov lr,pc
bx r0
所以问题是,我在静态库中定义了一些全局实例,但是上面的代码从未调用它们的构造函数。奇怪的是,应用程序的全局构造函数被成功调用,有人知道为什么吗?这是静态库和全局变量在运行时初始化时的一个众所周知的问题 大多数链接器只包含静态库的组件,这些组件是实现主程序依赖性所必需的。如果未使用编译单元中的任何对象,则链接器将从整体上删除或从不添加编译单元,并且不会发生全局初始化的副作用 最后的总结有一个很好的解释
对于标准库提供的启动代码,您也会遇到同样的问题。这是静态库和全局变量在运行时初始化时的一个众所周知的问题 大多数链接器只包含静态库的组件,这些组件是实现主程序依赖性所必需的。如果未使用编译单元中的任何对象,则链接器将从整体上删除或从不添加编译单元,并且不会发生全局初始化的副作用 最后的总结有一个很好的解释
对于标准库提供的启动代码,您也会遇到同样的问题。标准明确允许延迟静态对象初始化C++98、[basic.start.init]: 它是由实现定义的,无论对象的动态初始化是否为8.5、9.4、12.1、12.6.1 命名空间范围在main的第一条语句之前完成。如果初始化延迟到某个时间点 在main的第一个语句之后,它应在定义的任何函数或对象首次使用之前发生 在与要初始化的对象相同的转换单元中 最新的C++0x草案有一点不同的措辞
因此,如果您根本不使用某些转换单元,那么在那里定义的所有对象都可能被完全删除。标准明确允许延迟静态对象初始化C++98,[basic.start.init]: 它是由实现定义的,无论对象的动态初始化是否为8.5、9.4、12.1、12.6.1 命名空间范围在main的第一条语句之前完成。如果初始化延迟到某个时间点 在main的第一个语句之后,它应在定义的任何函数或对象首次使用之前发生 在与要初始化的对象相同的转换单元中 最新的C++0x草案有一点不同的措辞
因此,如果您根本不使用某些翻译单元,那么在那里定义的所有对象都可能被完全删除。好的观点+1,尽管他正在编写的代码是延迟发生的地方,因此在他的情况下没有延迟。初始值设定项不在全局初始值设定项列表中,因为链接器没有从库中提取这些翻译单元。好的一点是+1,尽管他正在编写的代码是延迟发生的地方,所以在他的情况下没有延迟。初始值设定项不在全局初始值设定项列表中,因为链接器没有从库中提取这些翻译单元。但是,如果没有应用程序代码引用静态库实例,是否有解决此问题的方法?@DVD:Unity build解决了此问题,因为库中只有一个编译单元。去掉库并在命令行上传递构成库的所有文件效果良好。当然,您可以引用主程序中的变量,以便在链接时将它们拉入。但是,如果不使用应用程序代码引用静态库实例,有没有解决此问题的方法?@DVD:Unity build解决了此问题,因为库中只有一个编译单元。去掉库并在命令行上传递构成库的所有文件效果良好。当然,您可以引用主程序中的变量,以便在链接时将它们拉入。