通过合并以下文章,我制定了在各种版本的 OPENCV 上运行代码的解决方案:
- 如何用宏创建字符串
- 连接宏中的字符串
- #defines 中的 Pragma 语句,支持 MSDN 上的 VS2008
- 奖励:如何在解决方案中定义全局设置
如前所述,如果您在不兼容的版本之间弹出,这可能会导致一些严重的问题,但对于那些支持的版本和功能,这可能对某些人有用。使用此技术设置一次 opencv 版本,并让您的代码通过以下任一方式自动链接到所需版本
在源代码的一处定义 OPENCV_VERSION
- 在属性表中定义它
- 在系统环境变量中定义它。
我的代码最终是这样的:
#include <iostream>
// #define OPENCV_VERSION $(OPENCV_VERSION)
// #define OPENCV_VERSION 220
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#define LINK_TO_OPENCV(libname) __pragma(comment(lib, "opencv_" #libname STR(OPENCV_VERSION)))
#define LINK_TO_OPENCV_DEBUG(libname) __pragma(comment(lib, "opencv_" #libname STR(OPENCV_VERSION) "d"))
#ifndef NDEBUG
LINK_TO_OPENCV_DEBUG("core")
LINK_TO_OPENCV_DEBUG("highgui")
LINK_TO_OPENCV_DEBUG("imgproc")
#else
LINK_TO_OPENCV("core")
LINK_TO_OPENCV("highgui")
LINK_TO_OPENCV("imgproc")
#endif
int main()
{
std::cout << STR(LINK_TO_OPENCV("core")) << "\n";
return 0;
}
现在在任何你喜欢的地方设置 OPENCV_VERSION。例如,您可以让每个人都包含一个头文件,其中包含以下行:
#define OPENCV_VERSION 220
或者您可以转到 Project->Properties->C/C++->Preprocessor 并将 Preprocessor Definitions 设置为 OPENCV_VERSION=220。或者,您可以在整个解决方案的共享属性表中执行相同的操作。
或者,这很重要,您可以使用此技术在 Windows 本身中定义一个名为 OPENCV_VERSION_ENV 的全局环境变量,并将其值设置为版本代码(例如 220)。然后您可以将预处理器定义设置为OPENCV_VERSION=$(OPENCV_VERSION_ENV)
,并将环境变量引入链接命令。你不能这样做,#define OPEN_VERSION $(OPENCV_VERSION_ENV)
但由于属性页会自动翻译 $(macros) 我们可以在那里获取环境变量。