首页 > 解决方案 > 链接器错误:丢弃部分中静态 constexpr 初始化程序列表成员变量的定义

问题描述

我有类似于以下代码的内容:

包括/Group.hpp

#pragma once    
#include <initializer_list>      
struct Group {
  static constexpr std::initializer_list<int> v = {1,2,3};    
};

包括/foo.hpp

#pragma once
void foo();

src/foo.cpp

#include <foo.hpp>
#include <Group.hpp>
#include <vector>

void foo(){
  std::vector<int> a{Group::v};
}

src/main.cpp

#include <vector>
#include <Group.hpp>
#include <foo.hpp>

int main()
{
  std::vector<int> b{Group::v}; // this
  foo();                        // or this, but not both
  return 0;
}

使用 编译时 g++ -std=c++17 -O1 -Iinclude src/foo.cpp src/main.cpp,会产生以下错误:

`._0' referenced in section `.text' of /tmp/ccojX9pJ.o: defined in discarded section `.rodata.._0[_ZN5Group1vE]' of /tmp/ccojX9pJ.o
`._0' referenced in section `.text' of /tmp/ccojX9pJ.o: defined in discarded section `.rodata.._0[_ZN5Group1vE]' of /tmp/ccojX9pJ.o
collect2: error: ld returned 1 exit status

可以肯定的是,c++filt _ZN5Group1vE返回Group::v.

foo()当在 main 中注释对其中一个或std::vector构造函数的调用时,错误消失。我在这里触及了一些未定义的行为还是编译器中存在错误?

我正在使用编译器g++ (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)

注意:代码编译没有错误clang++ (clang) version 7.0.1 (Fedora 7.0.1-6.fc29)

标签: c++c++17linker-errorsgcc8

解决方案


推荐阅读