C++ 引用构造函数时链接失败

C++ 引用构造函数时链接失败,c++,gcc,ld,C++,Gcc,Ld,我有两个源文件,其中一个是我自己的类foo的静态成员。当我把它编译成一个对象文件时,编译器会生成一个.ctors节,在它里面有一个调用构造函数的函数,让我们调用它\u GLOBAL\u SUB\u I\u FOO 在第二个源文件中,我尝试自己调用此构造函数: int _GLOBAL__SUB_I_FOO(); int bar(){ _GLOBAL__SUB_I_FOO(); } 当我链接这两个对象时,第二个文件中有一个未定义的对_GLOBAL\u SUB\u I\u FOO的引用。 当我

我有两个源文件,其中一个是我自己的类foo的静态成员。当我把它编译成一个对象文件时,编译器会生成一个.ctors节,在它里面有一个调用构造函数的函数,让我们调用它\u GLOBAL\u SUB\u I\u FOO

在第二个源文件中,我尝试自己调用此构造函数:

int _GLOBAL__SUB_I_FOO();
int bar(){
   _GLOBAL__SUB_I_FOO();
}
当我链接这两个对象时,第二个文件中有一个未定义的对_GLOBAL\u SUB\u I\u FOO的引用。 当我使用--relocatable链接以查看出了什么问题时,我可以看到原始构造函数被重命名为_GLOBAL\u SUB\u I\u FOO\u 0以避免“冲突”(这是故意的)。我能做些什么来修复它?
我正在使用gcc 7.3.0执行以前在静态对象构造函数中的代码,将其移动到
init()
函数中,并从构造函数(以及您需要的任何其他地方)调用该函数。

为什么不直接调用构造函数(创建对象)?它是一个静态对象的构造函数编译器创建了这个函数
\u GLOBAL\u SIB\u I\u FOO
,还是你写的函数?你为什么还要调用这个函数?在我看来,它应该作为一个实现细节隐藏起来。鉴于函数的名称是为实现保留的名称,很明显,你不应该自己调用它(即使你在技术上可以)。这是可能的,但不是我正在寻找的答案,我正在寻找一种更封闭的解决方案,它可以让我调用任何ctor,而不必在另一个函数中实现它。不过还是要感谢你。静态对象的问题在于,它们是由实现决定一次构造一次的。它是一个对象,因此只能构造一次。也许你会从基于
单例模式的东西中获得更好的里程数如果你想知道的话,我实际上是在实现调用构造函数的机制。只是我知道这不是标准的,但一定有办法做到。我不认为gcc 7.3.0与“跟我来”兼容。它总是为其内部函数选择一个唯一的名称,并且在您对代码进行任何更改之后,它总是这样做。如果你碰巧发现了一个黑客,可能是通过放入一个相邻的对象并相对于它的地址跳转,黑客仍然容易在任何其他编译器或该编译器的其他版本上失败。我只是觉得你想做的。。。是错的。你这么说是因为你知道,还是因为你的感觉?因为ld知道这是一个内部函数对我来说很奇怪——如果它知道,一定有办法将其标记为“正常”函数。我不是在寻找黑客,它只是从一个不同的对象调用一个函数。