从GCC 4.6更改为4.7时未定义的参考
Undefined reference when changing from GCC 4.6 to 4.7
我不得不从g++-4.6切换到4.7(这样我就可以使用一些C++11特性)。现在,编译器抱怨道:
In function WordJIT<float>::WordJIT(): undefined reference to JitRegType<float>::Val_t
我想知道这些编译器版本之间是否发生了影响符号解析的变化。还是在新版本(4.7)中更好地实现了该语言,而我所做的是错误的:(相同的代码与4.6一起编译)
jit.h
class Jit {
public:
enum RegType { f32=0,f64=1,u16=2,u32=3,u64=4,s16=5,s32=6,s64=7 };
// ...
};
template <class T> struct JitRegType {};
template <> struct JitRegType<float> { static const Jit::RegType Val_t = Jit::f32; };
wordjit.h
#include "jit.h"
template<class T>
class WordJIT
{
WordJIT() {
mapReg.insert( std::make_pair( JitRegType<T>::Val_t , jit.getRegs( JitRegType<T>::Val_t , 1 ) ) );
}
private:
typedef std::map< Jit::RegType , int > MapRegType;
mutable MapRegType mapReg;
};
编辑:
头文件中的static const
可以吗?还是应该使用constexpr
?
有没有办法在JitRegType
的类声明中也声明Val_t
,但不实际定义它?
根据9.4.2p3:
如果非易失性const static数据成员是整型或枚举型,则其在类定义中的声明可以指定大括号或相等的初始值设定项〔…〕如果在程序中使用odr,则该成员仍应在命名空间作用域中定义,并且命名空间作用域定义不应包含初始值设定值。
所以你需要添加到你的程序中(可能在jit.cpp
中):
const Jit::RegType JitRegType<float>::Val_t;
这样,如果static const
成员在需要引用它的上下文中使用,则存在链接器引用的唯一定义(与任何不是类模板或类模板部分专用化成员的static
成员相同)。
这个问题在gcc wiki上进行了深入讨论。
请注意,gcc 4.6和4.7都表现合理;只是gcc 4.6选择内联CCD_ 9的值,而gcc 4.7选择不内联(或者可能正在内联它。很难判断是否需要执行来发布诊断;9.4.2p3描述了可诊断规则,但9.4.2p4(隐含地指非const
static
数据成员)表示不需要诊断。不管怎样,作为一个实现质量问题,编译器发出诊断代码总比不发出要好。
- 编译C++时未定义的引用
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- 删除动态数组时未定义标识符
- 调用 Win32 API 函数时未定义的引用
- 与共享库链接时未定义的引用
- 编译为目标 wasm 时未定义的符号
- 错误:基类在从基类父派生类 Son 时未定义
- 在 tensorflow-GPU 中使用用户运算符时未定义的符号>=1.15
- 在Mono-Pinvoke中尝试使用本机C++时未定义的符号
- ctypes,添加静态库时未定义的符号
- 尝试使用 MinGW/CMake 构建 GLFW 示例时未定义的引用
- 尝试使用 Cython 扩展时未定义的符号
- 使用 glew 和 mingw 时未定义的引用?
- 链接到 Boost 1.63 静态库时未定义的引用
- gtest –– 使用TEST_F时未定义的符号
- 在FreesWitch中使用AWS C SDK加载模块时未定义的符号错误
- 错误:(49) 在 Android 中使用 OpenCV 原生时未定义对'cv::Stitcher::createDefault(bool)'的引用
- ImportError:在python中导入切换的c ++类时未定义的符号
- 在另一台计算机中运行 GTKMM 代码时未定义的符号
- 尝试与从 CUDA 对象构建的共享库链接时未定义的符号