关于GNU ld';旧式同步';警告 我有一些C++代码,它使用本地范围,程序生存期对象,例如 void testFunction(int arg) { static Tested tested(0); tested.use(arg); }

关于GNU ld';旧式同步';警告 我有一些C++代码,它使用本地范围,程序生存期对象,例如 void testFunction(int arg) { static Tested tested(0); tested.use(arg); },c++,thread-safety,ld,suppress-warnings,devkitpro,C++,Thread Safety,Ld,Suppress Warnings,Devkitpro,它与较旧版本的GCC构建得很好。 在GCC 8.2.0中,我在链接时得到了一个令人费解的警告: 警告:已使用旧版兼容同步。不适用于多线程应用程序 它指向定义测试的行,实际上有一个对编译器生成的_sync_synchronize()的调用。我想这是为了确保没有两个线程可以同时运行初始化代码,并且让延迟初始化产生与加载时初始化相同的结果 此测试类的实现重现了此问题: class Tested { int sum; public: Tested(int init) : sum(init) {}

它与较旧版本的GCC构建得很好。 在GCC 8.2.0中,我在链接时得到了一个令人费解的警告:

警告:已使用旧版兼容同步。不适用于多线程应用程序

它指向定义测试的行,实际上有一个对编译器生成的_sync_synchronize()的调用。我想这是为了确保没有两个线程可以同时运行初始化代码,并且让延迟初始化产生与加载时初始化相同的结果

此测试类的实现重现了此问题:

class Tested {
  int sum;
public:
  Tested(int init) : sum(init) {}
  void use(int arg) {
    sum += arg;
  }
  int current() const {
    return sum;
  }
};
此代码预计将在单线程嵌入式平台上运行

我认为这个警告与我无关,对吗


除了停止使用静态对象之外,我还能做些什么来消除警告消息?

您将收到由该版本的newlib生成的链接器警告,告诉您您的应用程序调用了
\u sync\u synchronize
,并且该函数没有实际同步的实现。newlib中该函数的实现是一个不做任何事情的存根(它的存在可能只是为了确保该函数没有未定义的引用)

这些调用可能来自
libstdc++。因此
,因为ARM上的GCC将对库中发生的某些原子操作发出
\uuu sync\u synchronize
调用(例如
std::string
共享的\u ptr
对象中的引用计数更新)

要获得使原子正确的工作的
\uu sync\u synchronize
,您可能需要链接到
libatomic
(使用
-latomic
),它将实现该功能。因为您没有链接到它,所以可以在newlib中获得回退存根实现。如果您不需要同步原子(因为您的应用程序是单线程的,并且从不尝试在信号处理程序中更新原子),那么我认为您可以忽略警告


另一种选择是使用libstdc++的构建,这样可以显式禁用所有线程,理论上不会有任何对
\uuuu sync\u synchronize
的引用。但是libstdc++.so的构建只能用于单线程应用程序。您现在使用的构建可以用于单线程和多线程代码(即使您收到与单线程情况不太相关的警告)。

您最好在等待回复,而不是在大多数人不熟悉devkitARM的站点上询问


tl;博士使用-fno threadsafe statics编译代码&不用担心。

请。什么是
测试的
?当然,函数静态仍然可以在总体上工作。代码甚至无法编译,因为这void testFunction(arg)。一旦修复,但你说它是从8.2开始的。你看过布奇拉吗?记住,这不是一个真实的、具体的版本。你试过了吗?@LightnessRacesinOrbit你完全是反向的,8.2.0是官方版本。8.1.0是8.x分支的第一个版本,8.2.0是第二个版本。8.2.1是gcc-8分支在8.2.0之后和8.3之前的某个时间未发布的快照。0@LightnessRacesinOrbit在那件事上你总是错的。自从gcc 5引入新版本以来,情况就一直如此,以前完全不同(x.y.z编号中没有区分“发布”和“快照”的部分,这是新方案的优点)。x、 0.0是主干构建,x.0.1是新版本主干分支后不久的预发行版,该方案不允许z>1的x.0.z。@LightnessRacesinOrbit这不是一个bug,不是。它只是一个支持armv4t和其他平台多线程的工具链。OP有点困惑。