使用 OpenCV 修复混合 STL 实现
Fixing mixed STL implementation with OpenCV
问题
我正在尝试启动 OpenCV 和 运行,但我 运行 遇到了与 this guy and this guy 相同的问题 - 我在尝试构建时遇到 linker 错误具有 C++ 接口的项目,但项目构建具有 C 接口。
第二个link,答案是"You're mixing different implementations of STL. VC10 (for OpenCV) and STLPort (for your code)."
如何确定我只使用 VC10? (或更高版本)
C风格(项目构建成功)
我正在使用 Visual Studio 2012 和 OpenCV 3.0
int main( int argc, char** argv )
{
char* filename = "input.tif";
IplImage *img0;
if( (img0 = cvLoadImage(filename,-1)) == 0 )
return 0;
cvNamedWindow( "image", 0 );
cvShowImage( "image", img0 );
cvWaitKey(0);
cvDestroyWindow("image");
cvReleaseImage(&img0);
}
C++ 风格(项目不构建)
int main( int argc, char** argv ) {
Mat image;
const string &filename = "input.tif";
image = imread(filename, IMREAD_COLOR); // Read the file
if(! image.data ) // Check for invalid input
{
std::cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
}
错误:
1>Source.obj : error LNK2019: unresolved external symbol "private: char * __thiscall cv::String::allocate(unsigned int)" (?allocate@String@cv@@AAEPADI@Z) referenced in function "public: __thiscall cv::String::String(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0String@cv@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Source.obj : error LNK2019: unresolved external symbol "private: void __thiscall cv::String::deallocate(void)" (?deallocate@String@cv@@AAEXXZ) referenced in function "public: __thiscall cv::String::~String(void)" (??1String@cv@@QAE@XZ)
1>Source.obj : error LNK2019: unresolved external symbol "class cv::Mat __cdecl cv::imread(class cv::String const &,int)" (?imread@cv@@YA?AVMat@1@ABVString@1@H@Z) referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol "void __cdecl cv::namedWindow(class cv::String const &,int)" (?namedWindow@cv@@YAXABVString@1@H@Z) referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol "void __cdecl cv::imshow(class cv::String const &,class cv::_InputArray const &)" (?imshow@cv@@YAXABVString@1@ABV_InputArray@1@@Z) referenced in function _main
VS中的include和lib路径设置
- C/C++/General/Additional 包含目录: C:\opencv\build\include
- 链接器/General/Additional 库目录:
\n
C:\opencv\build\x86\vc11\lib
- Linker/Input/Additional 依赖关系:
opencv_calib3d2410d.lib
opencv_contrib2410d.lib
opencv_core2410d.lib
opencv_features2d2410d.lib
opencv_flann2410d.lib
opencv_gpu2410d.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
opencv_legacy2410d.lib
opencv_ml2410d.lib
opencv_nonfree2410d.lib
opencv_objdetect2410d.lib
opencv_ocl2410d.lib
opencv_photo2410d.lib
opencv_stitching2410d.lib
opencv_superres2410d.lib
opencv_ts2410d.lib
opencv_video2410d.lib
opencv_videostab2410d.lib
根据聊天中的讨论,事实证明 OP 链接的是 OpenCV 2.4.10 而不是 OpenCV 3.0。
通过更正链接库,问题已解决。
问题
我正在尝试启动 OpenCV 和 运行,但我 运行 遇到了与 this guy and this guy 相同的问题 - 我在尝试构建时遇到 linker 错误具有 C++ 接口的项目,但项目构建具有 C 接口。
第二个link,答案是"You're mixing different implementations of STL. VC10 (for OpenCV) and STLPort (for your code)."
如何确定我只使用 VC10? (或更高版本)
C风格(项目构建成功)
我正在使用 Visual Studio 2012 和 OpenCV 3.0
int main( int argc, char** argv )
{
char* filename = "input.tif";
IplImage *img0;
if( (img0 = cvLoadImage(filename,-1)) == 0 )
return 0;
cvNamedWindow( "image", 0 );
cvShowImage( "image", img0 );
cvWaitKey(0);
cvDestroyWindow("image");
cvReleaseImage(&img0);
}
C++ 风格(项目不构建)
int main( int argc, char** argv ) {
Mat image;
const string &filename = "input.tif";
image = imread(filename, IMREAD_COLOR); // Read the file
if(! image.data ) // Check for invalid input
{
std::cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
}
错误:
1>Source.obj : error LNK2019: unresolved external symbol "private: char * __thiscall cv::String::allocate(unsigned int)" (?allocate@String@cv@@AAEPADI@Z) referenced in function "public: __thiscall cv::String::String(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0String@cv@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Source.obj : error LNK2019: unresolved external symbol "private: void __thiscall cv::String::deallocate(void)" (?deallocate@String@cv@@AAEXXZ) referenced in function "public: __thiscall cv::String::~String(void)" (??1String@cv@@QAE@XZ)
1>Source.obj : error LNK2019: unresolved external symbol "class cv::Mat __cdecl cv::imread(class cv::String const &,int)" (?imread@cv@@YA?AVMat@1@ABVString@1@H@Z) referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol "void __cdecl cv::namedWindow(class cv::String const &,int)" (?namedWindow@cv@@YAXABVString@1@H@Z) referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol "void __cdecl cv::imshow(class cv::String const &,class cv::_InputArray const &)" (?imshow@cv@@YAXABVString@1@ABV_InputArray@1@@Z) referenced in function _main
VS中的include和lib路径设置
- C/C++/General/Additional 包含目录: C:\opencv\build\include
- 链接器/General/Additional 库目录: \n C:\opencv\build\x86\vc11\lib
- Linker/Input/Additional 依赖关系: opencv_calib3d2410d.lib opencv_contrib2410d.lib opencv_core2410d.lib opencv_features2d2410d.lib opencv_flann2410d.lib opencv_gpu2410d.lib opencv_highgui2410d.lib opencv_imgproc2410d.lib opencv_legacy2410d.lib opencv_ml2410d.lib opencv_nonfree2410d.lib opencv_objdetect2410d.lib opencv_ocl2410d.lib opencv_photo2410d.lib opencv_stitching2410d.lib opencv_superres2410d.lib opencv_ts2410d.lib opencv_video2410d.lib opencv_videostab2410d.lib
根据聊天中的讨论,事实证明 OP 链接的是 OpenCV 2.4.10 而不是 OpenCV 3.0。
通过更正链接库,问题已解决。