C++ 如何强制链接器遵守对象文件顺序?

C++ 如何强制链接器遵守对象文件顺序?,c++,ld,dyld,static-initialization,static-order-fiasco,C++,Ld,Dyld,Static Initialization,Static Order Fiasco,我在一次未初始化的阅读中发现了Valgrind。我确切地知道它来自哪里——它是一个空的std::string,在cpp文件中声明,带有static存储类 静态归档文件中首先列出具有std::string存储分配的对象文件 # string of interest is located in a.o LIBOBJS := a.o b.o c.o ... x.o y.o z.o library.a: $(LIBOBJS) $(AR) $(ARFLAGS) $@ $(LIBOBJS)

我在一次未初始化的阅读中发现了Valgrind。我确切地知道它来自哪里——它是一个空的
std::string
,在
cpp
文件中声明,带有
static
存储类

静态归档文件中首先列出具有
std::string
存储分配的对象文件

# string of interest is located in a.o
LIBOBJS := a.o b.o c.o ... x.o y.o z.o

library.a: $(LIBOBJS)
    $(AR) $(ARFLAGS) $@ $(LIBOBJS)
    $(RANLIB) $@
此外,我将链接配方修改为以下内容(我知道它看起来很傻):

上面,
library.a
第一次列出,以确保
std::string
静态初始值设定项是第一个运行的初始值设定项<代码>库。第二次列出一个,以确保可以找到测试对象的所有符号,因为这些符号是单通链接器

从OS X和Linux上的Valgrind结果来看,链接器似乎不遵守对象文件顺序和静态初始化

我有两个问题。首先,我如何强制苹果的链接器尊重对象文件的顺序?第二,如何强制GNU的链接器尊重对象文件的顺序


我们不能使用链接器脚本。GCC人员特别告诉人们不要使用它们。另外,我不确定苹果平台上的格式


无论如何,这是在
init\u priority
不可用的情况下的回退。不幸的是,它在许多平台上都不可用。只有现代GNU链接器才有,而苹果完全没有


(我们的测试可以追溯到很多方面,从带有GCC 3.2的Fedora 1到Windows 2000)。

我确信静态(全局)对象初始化顺序不是为特定编译单元定义的。解决方案是将初始化本身包装在一个函数中,以便在该函数中始终初始化对象,而不是将其作为全局变量“无处不在”。在可能需要它的任何东西之前引用一个库将一事无成。我使用的所有链接器都是按对象文件顺序进行的。另请参阅。
program.exe: library.a $(TESTOBJS)
    $(CXX) $(CXXFLAGS) -o $@ ./library.a $(TESTOBJS) ./library.a -pthread