对无效"function" C++的未定义引用
undefined reference to void "function" C++
我收到以下错误:
features.cpp:(.text+0x4f6): undefined reference to `void Convolve<float>(CImageOf<float>, CImageOf<float>&, CImageOf<float>)'
因此,在我的功能.cpp文件中,我添加了以下头文件,其中包含以下内容:
template <class T>
void Convolve(CImageOf<T> src, CImageOf<T>& dst,
CFloatImage kernel);
我正在 ubuntu 64 位上使用 GCC 编译它。我意识到上面的错误是因为我的标题中的内容与引用不匹配,但那是因为模板,所以我不应该遇到这个问题吧?还发生了什么事?
我仔细检查了我的调用以卷积,实际上这是我正在使用的类型:
Convolve(CFloatImage, CFloatImage, CFloatImage);
我实际上找不到对上述错误的任何引用
如果将
函数模板放入.cpp文件中并在不同的翻译单元中使用它,则需要显式实例化模板,例如:
template
void Convolve<float>(
CImageOf<float> src,
CImageOf<float>& dst,
CFloatImage kernel);
基本上,编译器只有在看到其定义后才能实例化模板。如果您希望模板自动实例化,则需要在标头中定义它。
在与OP的聊天中发现,问题可能出在未正确链接的Makefile中。
没有定义,而是在 .h 文件中声明模板(正如你们中的一些人所建议的那样)。我认为OP混淆了术语。
但是,.cpp文件中有一个模板的定义以及一个实例化Convolve<float>
(和其他)的(非模板)函数定义。
所以重复一遍:代码是正确的,但构建例程不是。
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用