1

在过去的 4 个月里,我开始使用 OpenCV 和 OpenSceneGraph 等第 3 方库,我有一些基本问题......

1.)当我们使用任何函数时,我们在程序中提到的lib文件(包含函数)(例如-lcv.lib,-lhighgui.lib)会依次调用bin文件夹中的相应.dll文件吗?这个调用发生在运行时?

2.) 使用 CMAKE、MAKE 和 Visual Studio 解决方案文件从源代码中静态构建和动态构建 lib 文件和 dll 文件有什么区别?

3.) 使用 .dll 的好处仅仅是为了减小可执行代码的大小吗?

4.)在嵌入式视觉应用程序(或任何使用库的嵌入式应用程序)中,整个可执行代码是否转储在处理器/控制器/芯片中?嵌入式应用程序中是否有后期绑定或运行时调用的概念?

请对这些问题提供一些见解,以便我可以了解我使用的代码中发生了什么......提前谢谢......

4

4 回答 4

2

1.) when we use any function does the lib files (containing the function) which we mention (e.g. -lcv.lib , -lhighgui.lib) in our program in turn call the respective .dll files found in the bin folder?does this call take place at runtime?

yes, the libs contain only information for the linker to be able to resolve the functions addressed in your exe. the actual code is loaded during runtime.

2.)whats the difference between static build and dynamic build of the lib files and dll files from the source code using CMAKE,MAKE and Visual Studio Solution files?

none, visual studio just makes it a bit more convenient (subjectively).

3.)is the benefit of using .dll only to reduce the size of the executable code?

it is possible (if compatible with previous version e.g. interface not changed) to change the dll contents without recreating the exe.

one can also lazy load libraries (i.e. not link with a .lib file and instead use LoadLibrary/GetProcAddress) at a later point and thus one could have optional functionality in a dll and if it is there enable but still be able to run if the dll is not found.

4.)in embedded vision applications (or any embedded application using libraries) is the whole executable code dumped in the processor/controller/chip?is there any concept of late binding or runtime call in embedded applications?

it depends on the OS, often (at least in the embedded projects I have been involved so far) static libs are used because the OS on the embedded device doesn't support shared libraries. if the OS supports it then fine but often the hardware/software on embedded devices is very limited.

于 2012-08-23T05:22:06.163 回答
1

是的,关键是要消除重复,这样您就没有 100 个应用程序都在其可执行文件中内置了相同库的副本。理论上,这也将允许在一个地方完成对库的更新,而不是更新 100 个应用程序。

动态链接是操作系统支持的功能。所以答案取决于您在嵌入式系统上运行的操作系统。许多嵌入式目标都在运行 Linux,因此在这种情况下,您的行为与在 PC 上完全相同。

微控制器上较小的操作系统通常不支持动态链接。

于 2012-08-22T14:50:27.633 回答
1

默认情况下,dll 在应用程序启动时加载,但您可以手动更改加载 dll(不记得它是如何工作的,但有点无聊)。静态构建意味着您需要的所有 opencv 函数都在 .exe 文件中,而不是在您机器上的某个位置。

我会说对于真正的嵌入式应用程序,最好使用静态链接,因为您通常只运行一个程序。在您的机器上,您将有 20 个使用 opencv 的程序,因此如果您让它们动态加载 dll,它应该会在您的机器上节省大量内存。由于 opencv 每 3 个月更改一次版本,我会说最好将 opencv 作为静态链接分发。对于大型程序,它更有意义....

于 2012-08-22T14:51:01.577 回答
1

您可以将代码编译为单个巨大的可执行文件,将所有模块复制到自身中,或者将它们编译为一个小的可执行文件和一组动态可加载的模块,以 DLL 或共享库的形式。共享库/DLL 使您的可执行代码模块化、可维护并允许可执行代码的可重用性,从而使您的可执行文件的大小更小。您可以独立且轻松地将修复程序发送到您的动态模块,而无需触及您的主要可执行文件。此外,许多可执行文件可以在运行时共享和加载相同的 DLL/共享库,从而实现可重用性并减少磁盘空间需求。

现在,您的动态模块可以使用其他 3rd 方库,这些库可以作为动态模块本身再次发布。这意味着每当您的动态模块被引用时,系统将尝试定位并解析它所依赖的模块。因此,它是一个依赖解决链。

据我了解,嵌入式系统使用小型嵌入式操作系统。您可以将您的应用程序发送到操作系统可以引用的某种内存上;它可以是可插入的磁盘驱动器或嵌入式存储设备或其他东西,具体取决于嵌入式系统的复杂程度。如果操作系统支持动态加载共享模块,那么您当然可以将您的应用程序作为一组可执行和动态模块发布。

于 2012-08-22T15:16:57.650 回答