提问人:RoSv 提问时间:10/8/2023 最后编辑:RoSv 更新时间:10/8/2023 访问量:81
静态内联变量的 g++ 链接错误thread_local
Linking error with g++ for static inline thread_local variable
问:
我有三个文件,我正在使用 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 进行编译。更多信息:
根据我对静态内联的理解,它应该完全避免像这里这样跨不同的翻译单元存在多个定义。
由于 lib.h 文件位于仅标头库中,我不想更改其中的任何内容,我相信错误以某种方式存在于我的构建设置中。
当我删除关键字“thread_local”时,问题就消失了。
在我的 Windows 上更改为 clang64 编译器也解决了这个问题,并且项目编译时没有错误!
我最好的选择是这是 MinGW 的 g++ 编译器(或链接器)中的一个错误(可能与此处提到的问题相同:源软件?非常感谢任何有助于了解正在发生的事情的帮助。
答: 暂无答案
评论
inline thread_local
static thread_local