使用 opencv 在 C++ 程序中包含 stdafx.h 文件的目的是啥
Posted
技术标签:
【中文标题】使用 opencv 在 C++ 程序中包含 stdafx.h 文件的目的是啥【英文标题】:What is the purpose of including the stdafx.h file in a C++ program using opencv使用 opencv 在 C++ 程序中包含 stdafx.h 文件的目的是什么 【发布时间】:2010-07-21 12:40:24 【问题描述】:这是一个示例代码。如果我删除 stdafx.h 文件,程序将无法编译。
stdafx.h 文件
'#pragma once
'#include "targetver.h"
'#include <stdio.h>
'#include <tchar.h>
Capture.ccp
// Capture.cpp : 定义控制台应用程序的入口点。 //
'#include "stdafx.h"
'#include "string.h"
'#include "cv.h"
'#include "highgui.h"
int _tmain(int argc, char ** argv[])
CvCapture * pCapture = 0;
IplImage * pVideoFrame = 0;
int i;
char filename[50];
//Initialize vieo capture
pCapture = cvCaptureFromCAM( CV_CAP_ANY );
if( !pCapture )
fprintf(stderr, "failed to initialize video capture\n");
return -1;
//Capture three video frames and write them as files
for(i=0;i<20;i++)
pVideoFrame = cvQueryFrame( pCapture );
if( !pVideoFrame )
fprintf(stderr, "failed to get a video frame\n");
//Write the captured video frame as an image file
sprintf(filename, "VideoFrame%d.jpg", i+1);
if( !cvSaveImage(filename, pVideoFrame))
fprintf(stderr, "faile dto write image file %s\n", filename);
//IMPORTANT : Don't release or modify the image returned
//from cvQueryFrame() !
//Terminate video capture and free capture resources
cvReleaseCapture( &pCapture );
return 0;
stdafx.h 文件的用途是什么——顺便说一下,这个文件是自动生成的。
非常感谢
【问题讨论】:
请不要使用#pragma once,它不是c++,它依赖于编译器。请改用包含守卫 (en.wikipedia.org/wiki/Include_guard)。 【参考方案1】:它是编译器Precompiled Header 的一部分,用于加快构建速度。
【讨论】:
如果您想删除它,您需要修改该 .cpp 文件(或所有文件)的编译设置以删除“使用预编译头”选项 - 这就是它失败的原因。但没有理由这样做。如果它们在您的应用中被广泛使用,您还可以将更多标题移入其中,以节省在整个过程中重新编译它们。【参考方案2】:正如 peterchen 所说,它用于加速构建和添加一些 Windows 内容。此包含完全是 Visual Studio 特定的,如果您希望您的程序是跨平台的,则不应使用,Open Cv 库就是这种情况(您可以在 windows、linux、.. .).
你的编译错误信息是什么?
【讨论】:
特定于 Visual Studio,而不是 Windows。您可以将 gcc 与您知道的 mingw 一起使用 ;-) 总之,我写的很快;)我现在就编辑我的答案。 嗯?它不会加速其他平台上的构建,但没有理由会破坏任何东西。它只是一个头文件。甚至 GCC 也支持#pragma once
IIRC
它会因为它不存在而中断,如果你导入它,它会引用其他不存在的包含。至少,您应该在它周围有警卫检查 MSVC / windows 构建。编译器支持非标准附加组件这一事实并不意味着您必须使用它们。 C++ 在设计上很糟糕,但你必须处理它。 ;-)
@Rup:不幸的是,并非在所有情况下。使用预编译头文件的默认设置,VC5-2008 期望 #include "stdafx.h"
即使正确的路径是例如"../stdafx.h"
。 (不了解 VS2010,但我不会在修复这个问题上赌一磅狗粮。)此外,当 stdafx.h 设置为预编译头时,所有声明/包含都将被忽略。以上是关于使用 opencv 在 C++ 程序中包含 stdafx.h 文件的目的是啥的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 2.4:Windows 中 Qt 中包含的问题