Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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
C++ ctor init不调用库中的全局ctor实例_C++_Assembly_Constructor_Arm_Startup - Fatal编程技术网

C++ ctor init不调用库中的全局ctor实例

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 所以问题是,我在静态库中定义了一些全局实例,但是上面的代码从未调用它们的构造函数。奇怪的是,应用程序的全局构造函数被成功调用,有人知道为什么吗?这是静态库和全局变量在运行时初始化时的一个众所周知的问题 大多数链接器只包含静

我正在使用SourceryGpp lite for arm开发一个应用程序和一个库

我没有使用标准的libs或默认的开始文件。 因此,要调用全球CTR,我正在执行以下代码:

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解决了此问题,因为库中只有一个编译单元。去掉库并在命令行上传递构成库的所有文件效果良好。当然,您可以引用主程序中的变量,以便在链接时将它们拉入。