OPENCV静态编译与动态编译

合集下载

静态库和动态库编译

静态库和动态库编译

静态库和动态库编译静态库和动态库是编程中常用的两种库文件形式,本文将介绍它们的编译过程和使用方法。

1. 静态库编译静态库是一种在编译时被链接到程序中的库文件,它包含了程序所依赖的所有函数和数据结构,因此程序在运行时不需要再加载库文件。

静态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件(.o 或 .obj)。

(2)将多个目标文件打包成一个静态库文件,通常使用 ar 工具完成此操作。

例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.a 的静态库文件:$ ar rcs libfoo.a foo1.o foo2.o ...其中,rcs 参数分别表示创建、向库文件中添加目标文件和生成索引表。

(3)在编译器中使用静态库,需要将其链接到目标程序中。

在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.a 的静态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 参数指定库文件搜索路径,. 表示当前目录;-l 参数指定链接库文件,实际上是将其前缀 lib 和后缀 .a 去掉,即 foo。

2. 动态库编译动态库是一种在程序运行时动态加载的库文件,它只包含程序所需要的部分函数和数据结构,因此可以减小程序的尺寸和加载时间。

动态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件。

(2)将多个目标文件打包成一个共享库文件,通常使用 ld 或链接器完成此操作。

例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.so 的动态库文件:$ gcc -shared -o libfoo.so foo1.o foo2.o ...其中,-shared 参数表示生成共享库文件。

(3)在编译器中使用动态库,需要将其链接到目标程序中。

在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.so 的动态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 和 -l 参数的含义同静态库。

C语言中的静态分析与动态分析技巧

C语言中的静态分析与动态分析技巧

C语言中的静态分析与动态分析技巧在C语言编程中,静态分析和动态分析是两种常用的技巧,用于检测程序中潜在的问题和优化程序性能。

静态分析是在编译时进行分析的过程,主要用来检测代码中的潜在错误和漏洞,而动态分析则是在程序运行时进行分析的过程,用来检测程序的性能和调试错误。

以下将分别介绍C语言中的静态分析和动态分析技巧。

静态分析技巧主要包括代码审查、静态代码分析工具和静态代码检查。

代码审查是由程序员或团队成员对代码进行逐行检查,以发现潜在的错误和改进代码质量。

这种方法虽然效果显著,但耗时耗力。

静态代码分析工具则是利用专门的软件工具对代码进行全面的分析,识别潜在的问题,并提供改进建议。

常用的静态代码分析工具包括Lint、Pylint、Coverity等。

静态代码检查是一种自动化工具,可以在编译代码时发现潜在的问题,并生成相应的报告。

开发人员可以根据报告进行适当的调整和改进代码。

动态分析技巧主要包括性能分析和调试。

性能分析是通过对程序运行时的各个方面进行监测和测量,以确定程序的性能瓶颈并优化程序性能。

常用的性能分析工具包括Valgrind、Gprof、Perf等。

调试是通过跟踪程序的执行过程,诊断程序中的错误和异常行为。

常用的调试工具包括GDB、LLDB等。

通过这些工具,开发人员可以更容易地找到程序中的bug,调试程序,并提高程序性能。

总的来说,静态分析和动态分析技巧在C语言编程中都是非常重要的。

静态分析可以提前发现潜在的问题,保证代码质量,而动态分析则可以帮助调试程序,优化程序性能。

开发人员可以根据具体的需求选择不同的分析技巧,以提高代码质量和程序性能。

希望以上介绍对您有所帮助,欢迎您进一步深入学习和探讨C语言中的静态分析和动态分析技巧。

静态和动态编译QT

静态和动态编译QT

这时编译同样得到一个非常大的可执行程序(我写的这个贪吃蛇一共500多行,生成的exe有8M)。用AspPack压缩一下。就可以发给用户了(这时是2.6M)。
quote: “这样编译出来的程序比较大,可以先用strip命令去掉程序里面一些无用信息后,用ASPack或者UPX之类的压缩加壳软件压缩一下,两者的压缩率基本都达到30%多一点,压缩效果还是很明显的。”
删除其中的”-mthreads”
quote:
一般只有用到threads的时候才用到mingwm10.dll,我们通常遇到的”缺少 mingwm10.dll”问题,可以在程序qmake生成makefile.release文件后删除”-mthreads”参数即可,一般在 “LFLAGS”后面。当然,这只是临时解决方案,每次都要手动修改,也可以在编译QT前先修改qmake.h,不过不推荐这种方法。其实, mingwm10.dll也就十多K,每次发布程序时一起打包也无所谓。
这个过程需要1-2个小时。QT目录会变成1.8G左右。注:mingw32-make和make是一样的。
如果用VC2005平台,在编译Qt的时候,configure.exe -static -platform win32-msvc2005
然后nmake sub-src或者nmake release sub-src完成静态编译。
5 解决MinGW的mingwm10.dll依赖问题
在Makefile.release里找到:
LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -static -Wl,-s -Wl -mthreads -Wl, -subsystem,windows

【Java动态编译】动态编译的应用

【Java动态编译】动态编译的应用

【Java动态编译】动态编译的应⽤1、动态编译动态编译,简单来说就是在Java程序运⾏时编译源代码。

从JDK1.6开始,引⼊了Java代码重写过的编译器接⼝,使得我们可以在运⾏时编译Java源代码,然后再通过类加载器将编译好的类加载进JVM,这种在运⾏时编译代码的操作就叫做动态编译。

静态编译:编译时就把所有⽤到的Java代码全都编译成字节码,是⼀次性编译。

动态编译:在Java程序运⾏时才把需要的Java代码的编译成字节码,是按需编译。

静态编译⽰例:静态编译实际上就是在程序运⾏前将所有代码进⾏编译,我们在运⾏程序前⽤Javac命令或点击IDE的编译按钮进⾏编译都属于静态编译。

⽐如,我们编写了⼀个xxx.java⽂件,⾥⾯是⼀个功能类,如果我们的程序想要使⽤这个类,就必须在程序启动前,先调⽤Javac编译器来⽣成字节码⽂件。

如果使⽤动态编译,则可以在程序运⾏过程中再对xxx.java⽂件进⾏编译,之后再通过类加载器对编译好的类进⾏加载,同样能正常使⽤这个功能类。

动态编译⽰例:JDK提供了对应的JavaComplier接⼝来实现动态编译(rt.jar中的javax.tools包提供的编译器接⼝,使⽤的是JDK⾃带的Javac编译器)。

⼀个⽤来进⾏动态编译的类:public class TestHello {public void sayHello(){System.out.println("hello word");}}编写⼀个程序来对它进⾏动态编译:public class TestDynamicCompilation {public static void main(String[] args) {//获取Javac编译器对象JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();//获取⽂件管理器:负责管理类⽂件的输⼊输出StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null);//获取要被编译的Java源⽂件File file = new File("/project/test/TestHello.java");//通过源⽂件获取到要编译的Java类源码迭代器,包括所有内部类,其中每个类都是⼀个JavaFileObjectIterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjects(file);//⽣成编译任务pilationTask task = compiler.getTask(null, fileManager, null, null, null, compilationUnits);//执⾏编译任务task.call();}}启动main函数,会发现在程序运⾏过程中,使⽤了Javac编译器对类TestHello进⾏了编译,并⽣成了字节码⽂件TestHello.class。

【IT专家】如何做到linux下opencv程序的静态编译

【IT专家】如何做到linux下opencv程序的静态编译

本文由我司收集整编,推荐下载,如有疑问,请与我司联系如何做到linux 下opencv 程序的静态编译2009/08/27 10 第一,程序是没有问题的,用的是官方网站的人脸检测的源代码,使用编译命令g++`pkg-configopencv--libs--cflagsopencv`facedect.cpp-ofacedect 编译出来的可执行文件,是可以检测出人脸区域的。

第二.我想把静态编译该程序,使用了以下编译命令g++-I/usr/local/include/opencv-L/usr/local/lib:/usr/lib:/libfacedect.cpp-ofacedect/usr/local/lib/libhighgui.a/usr/local/lib/libcv.a/usr/local/lib/libcxcore.a/usr/local/li b/libcvaux.a/usr/local/lib/libml.a/usr/lib/libgio-2.0.a 结果出了一堆错误:/usr/local/lib/libhighgui.a(window_gtk.o):Infunct ion`icvOnKeyPress’:/home/apple/tools/o pencv-1.0.0/otherlibs/highgui/window_gtk.cpp:1085:undefinedreferenceto`g_threads_got_initiali zed’/home/apple/tools/opencv-1.0.0/otherlibs/highgui/window_gtk.cpp:1085:undefinedreferenceto`g_thread_functions_fo r_gli b_use’/home/apple/tools/opencv-1.0.0/otherlibs/highgui/window_gtk.cpp:1093:undefinedreferenceto`g_thread_functions_fo r_glib_use’/home/apple/tools/opencv-1.0.0/otherlibs/highgui/window_gtk.cpp:1094:undefinedreferenceto`g_thread_functions_fo r_glib_use’/usr/local/lib/libhighgui.a(window_gtk.o):Infunction`cvWaitKey’:/home/apple/ tools/opencv-1.0.0/otherlibs/highgui/window_gtk.cpp:1251:undefinedreferenceto`g_timeout_add’/home /apple/tools/opencv-1.0.0/otherlibs/highgui/window_gtk.cpp:1253:undefinedreferenceto`gtk_main_iteration_d o’/home/apple/tools/opencv-1.0.0/otherlibs/highgui/window_gtk.cpp:1257:undefinedreferenceto`g_source_remove’/ho me/apple/tools/opencv-1.0.0/otherlibs/highgui/window_gtk.cpp:1224:undefinedreferen ceto`g_thread_self’/home/a。

GCC编译步骤及静态库动态库制作

GCC编译步骤及静态库动态库制作

GCC编译步骤及静态库动态库制作GCC是一种广泛使用的编译器,可以将C、C++等高级语言源代码转换为可执行的机器码。

本文将介绍GCC编译步骤及制作静态库和动态库的过程。

1. 预处理(Preprocessing):预处理器会处理源代码,根据预编译指令进行操作,例如宏展开、条件编译等。

预处理后的代码仍然是源代码,只是进行了一些文本替换和宏展开操作。

3. 汇编(Assembling):汇编器将汇编语言转换为机器码,生成目标文件(Object Files)。

目标文件包含可执行代码的二进制表示,以及与其他目标文件和库文件链接的信息。

4. 链接(Linking):链接器将多个目标文件和库文件结合在一起,生成最终的可执行文件。

链接器会解析目标文件之间的引用和符号,将它们关联起来,并生成可执行文件。

静态库制作:静态库是一种包含可执行代码和函数的库文件,在链接时会将库文件中的代码复制到最终的可执行文件中。

静态库的制作分为以下几个步骤:1.编写库代码:创建一个或多个源文件,其中包含一些可重用的函数和类。

确保将库代码编写成独立的、可移植的模块。

2. 编译库代码:使用GCC进行编译,将源代码文件编译成目标文件。

例如,对于C文件使用以下命令编译为目标文件:`gcc -c file1.cfile2.c`。

3. 归档库文件:将目标文件归档成库文件。

使用GCC进行归档时,可以使用`ar`命令。

例如,使用以下命令将目标文件归档:`ar rcs libmylib.a file1.o file2.o`。

这将创建名为libmylib.a的静态库文件。

4. 使用库文件:在需要使用库函数的程序中,包含库的头文件,并在链接时将库文件链接到程序中。

例如,使用以下命令编译和链接程序:`gcc -o myprog myprog.c -L. -lmylib`。

其中,-L参数指定库文件的路径,-l参数指定要链接的库文件。

在程序中使用库函数时,只需包含相应的头文件,并调用库函数。

cmake opencv viz 模块编译

cmake opencv viz 模块编译

一、概述CMake是一个跨评台的自动化建构系统,用于管理软件建构流程。

OpenCV是一个开源计算机视觉库,提供了丰富的功能,包括图像处理、计算机视觉、机器学习等。

Viz模块是OpenCV库中的一个3D 可视化模块,用于可视化和交互式操作3D数据。

本文旨在介绍如何使用CMake编译OpenCV中的Viz模块,以便开发者能够更好地了解和使用该模块。

二、准备工作1. 安装CMake需要在计算机上安装CMake。

可以从CMake官方全球信息湾上下载适合你操作系统的安装包,并按照官方指南进行安装。

安装完成后,可以在命令行中使用cmake命令。

2. 下载OpenCV源代码前往OpenCV官方全球信息湾下载最新的OpenCV源代码,并解压到你喜欢的目录。

3. 确认系统环境在开始编译前,需要确认你的系统环境已经安装了必要的编译工具和依赖项,比如C++编译器、图形库、线程库等。

这些依赖项的安装方法因操作系统而异,可以在OpenCV官方全球信息湾上找到对应的安装指南。

三、编译Viz模块1. 创建build目录在OpenCV源代码目录外创建一个build目录,用于存放编译生成的文件。

这样做可以保持源代码目录的干净,方便管理。

2. 运行CMake在命令行中进入build目录,然后执行以下命令:```plaintextcmake /path/to/opencv/source```这里的"/path/to/opencv/source"是你的OpenCV源代码目录的路径。

CMake会根据系统环境和配置文件生成一些中间文件,并输出一个Makefile,用于后续的编译操作。

3. 配置选项在运行CMake时,你可以添加一些选项来控制编译过程。

可以使用"-D WITH_VTK=ON"来启用VTK支持,"-DCMAKE_BUILD_TYPE=Release"来指定编译类型为Release等。

opencv 静态库使用方法

opencv 静态库使用方法

opencv 静态库使用方法
OpenCV是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉功能。

要使用OpenCV的静态库,你需要按照以下步骤进行操作:
1. 下载和安装OpenCV,首先,你需要从OpenCV官方网站下载OpenCV库,并按照官方文档提供的安装指南进行安装。

安装过程中需要注意选择编译静态库的选项。

2. 创建一个新的C++项目,在你的集成开发环境(IDE)中创建一个新的C++项目,例如使用Visual Studio或者CLion。

3. 配置项目属性,在项目属性中,你需要添加OpenCV的头文件路径和静态库文件路径。

这可以通过设置包含目录和库目录来实现。

4. 链接OpenCV静态库,在项目属性中,你需要指定要链接的OpenCV静态库名称,这些库文件通常以“lib”开头,以“.lib”为后缀。

你可以在链接器设置中指定这些库文件。

5. 编写代码,现在你可以开始编写使用OpenCV函数的代码了。

记得包含OpenCV的头文件,并使用OpenCV的命名空间。

6. 编译和运行,完成以上步骤后,你可以编译你的项目并运行
程序了。

确保你的程序能够正常链接OpenCV静态库并调用其中的函数。

需要注意的是,使用OpenCV的静态库可能会增加你的程序的体积,因为所有的函数和依赖项都会被静态链接到你的程序中。

另外,不同版本的OpenCV可能需要不同的配置和设置,所以建议在使用之
前仔细阅读官方文档和参考资料。

希望这些步骤能够帮助你成功使
用OpenCV的静态库。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、序言
当一个opencv工程实现之后,我们会面临一个问题,怎么把opencv程序的exe在其他电脑上运行,这个问题已经有很多人遇到过,当然也有很多人给出了博客,介绍了具体的解决方法,具体自己操作时,还是遇到了这样或者那样的小毛病,不过凭借自己根据错误提示解决问题的能力,最后还是把静态编译给编译成功了。

本文介绍两种opencv程序移植到其他电脑运行的方法,一种是动态编译,需要拷贝程序运行需要的dll,也就是-个exe跟着多个dll的模式,这种简单粗暴,但是显得拖拖拉拉,一个程序还得跟着那么多其他文件,所以我们很不推荐。

另外一种就是本文主要介绍的静态编译,和之前运行不一样,我们在这使用的不是opencv的lib库,而是staticlib,编译成功之后,程序只需要拷贝一个exe,就可以在其他电脑上运行。

另外介绍一下本文测试程序工作的程序配置
操作系统Win7
IDE VS2010
opencv版本opencv2.4.5
二、动态编译
为了做一个全面的总结,在这简单的介绍opencv动态编译的方法。

opencv动态编译需要两部分dll:
(1)opencv库的dll,检查你所引用的h文件,把对应的dll,拷贝过来就行,注意debug和release的不同,当然一般程序发布的话都会用release版本的,因为release版本比debug版本要快10倍有余。

(2)考虑到目标终端有可能没有装vs,所以需要拷贝msvcp110.dll和msvcr110.dll(release下),dll在C:/Windows/System32下。

三、静态编译
静态编译主要的不同就是利用的是
H:/Opencv2.4.5/opencv/build/x86/vc11/staticlib文件下的lib,而非
H:/Opencv2.4.5/opencv/build/x86/vc11/lib文件夹。

具体配置如下:
1.新建空项目,项目名称Static_Opencv
2.新建cpp,写入一个简单opencv测试程序:
#include<opencv2/core/core.hpp>#include
<opencv2/highgui/highgui.hpp>using namespace cv;void main(){cv::Mat image=cv::imread("img1.png");cv::flip(image,image,1);
cv::imwrite("flip.jpg",image);}
3.新建一个属性管理器
视图-》属性管理器-》Debug-》右键-》添加新项目属性表
属性表名称改为PropertySheet_Static_Opencv_debug。

4.编辑属性表
右键属性表-》属性-》VC++目录-》包含目录,然后添加opencv的h文件目录:
库目录里面添加staticlib文件夹目录
然后C/C++-》代码生成-》运行库-》多线程调试(/MTd),
介绍一下这四个选项,多线程(/MT)为静态链接release模式,多线程调试(/MTd)为静态链接debug模式,多线程dll(/MD)为动态链接release模式,多线程调试DLL(/MDd)为动态链接debug模式。

5.最后在程序中添加#pragmatic,使用程序调用lib
完整的程序如下:
#include<opencv2/core/core.hpp>#include
<opencv2/highgui/highgui.hpp>#pragma comment(lib,
"IlmImfd.lib")#pragma comment(lib,"libjasperd.lib")#pragma
comment(lib,"libjpegd.lib")#pragma comment(lib,
"libpngd.lib")#pragma comment(lib,"libtiffd.lib")#pragma comment(lib, "zlibd.lib")#pragma comment(lib,"opencv_core245d.lib")#pragma comment(lib,"opencv_highgui245d.lib")#pragma comment(lib,
"vfw32.lib")#pragma comment(lib,"comctl32.lib")using namespace cv;void main(){cv::Mat image=cv::imread("img1.png");
cv::flip(image,image,1);cv::imwrite("flip.jpg",image);}
最后程序运行会出现很多warning,但是不影响运行,程序大小为7.5M!挺大的,但是一个大程序,总比一个exe跟着多个dll好啊。

6.程序运行结果原图:
结果图:。

相关文档
最新文档