c++ - 链接器错误:丢弃部分中静态 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)
解决方案
推荐阅读
- selenium - Unable to click "Create an account" button on Firefox browser by robot framework
- javascript - How to fetch correct tokenID/accessToken with google sign in with a web app created with create-react-app and using firebase
- java - Regex to match a phrase that is not inside an tag
- sql - Sql 查询以获取最高分
- nuxeo - Building Nuxeo source code, dart issue
- python - 如何在python中表示方波以及如何对其进行卷积?
- sql - 对于 XML 路径:如何将属性和值保持在同一个节点中
- windows-10 - Install .appxbundle on Windows 10 Home edition
- c++ - Linking errors GoogleMock with my C++project under linux
- azure - 如何获取在 Azure 注册的域的 EPP 代码?