静态内联变量的 g++ 链接错误thread_local

Linking error with g++ for static inline thread_local variable

提问人:RoSv 提问时间:10/8/2023 最后编辑:RoSv 更新时间:10/8/2023 访问量:81

问:

我有三个文件,我正在使用 CMake 编译在一起(产生错误的最小示例):

库.h

#ifndef lib
#define lib

struct StructOuter{
    struct StructInner{
        int a;
        StructInner(int aa) {
            a = aa;
        }
    };

    static inline thread_local StructInner problemStruct{3};
};


#endif

其他.cpp

#include "lib.h"

main.cpp

#include "lib.h"

int main() {
    StructOuter t = StructOuter{};
    return t.problemStruct.a;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.25)
project(proj)

set(CMAKE_CXX_STANDARD 20)

add_executable(proj main.cpp other.cpp)

在这里我得到错误:

'StructOuter 的 TLS 初始化函数::p roblemStruct' ...collect2.exe:错误:ld 返回 1 退出状态忍者:生成已停止:子命令失败

我在我的 Windows 计算机上收到错误,我正在将 Clion 与 gcc 9.3 和 MinGW 的 g++ 一起使用并使用 C++20 进行编译。更多信息:

  1. 根据我对静态内联的理解,它应该完全避免像这里这样跨不同的翻译单元存在多个定义。

  2. 由于 lib.h 文件位于仅标头库中,我不想更改其中的任何内容,我相信错误以某种方式存在于我的构建设置中。

  3. 当我删除关键字“thread_local”时,问题就消失了。

  4. 在我的 Windows 上更改为 clang64 编译器也解决了这个问题,并且项目编译时没有错误!

我最好的选择是这是 MinGW 的 g++ 编译器(或链接器)中的一个错误(可能与此处提到的问题相同:源软件?非常感谢任何有助于了解正在发生的事情的帮助。

C++ 编译器错误 链接器 线程本地 仅标头

评论

1赞 HolyBlackCat 10/8/2023
在 GCC 13 上从 MSYS2 复制。
0赞 HolyBlackCat 10/8/2023
我会尝试移动它,例如 在命名空间范围或函数范围。inline thread_localstatic thread_local
1赞 dewaffled 10/8/2023
只是一个错误 - 错误 81915 - 带有thread_local内联变量的错误。链接的错误 Bug 102398 - thread_local 在主文件状态之外无法正常工作,即使没有内联,在不同的文件中定义thread_local也存在类似的问题。
0赞 RoSv 10/8/2023
@HolyBlackCat,你的意思是出于调试目的吗?如前所述,它发生在仅标头库中,因此我真的不想通过更改它来“修复”它。感谢您的回复:)
1赞 HolyBlackCat 10/8/2023
我建议的所有替代方案都可以在仅标头库中使用。

答: 暂无答案