使用 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 中包含的问题

qt:在一个 gui 窗口中包含 opencv 和 opengl 子窗口

如何在应用程序中包含 Visual C++ 再分发

在 linux 下的 c++ 程序中包含 amp.h 库

c++ 程序是不是可以在 if/else 语句中包含 switch 语句[关闭]