我知道这可能是一个非常愚蠢的问题,但我对编译语言是个新手(我的领域主要是脚本语言,如PHP、Python或JavaScript)。
我正在为一个项目学习C++,在这个项目中,它是我唯一可以使用的语言。
我用Ubuntu 10.10写了一个程序,然后编译了它。我可以像这样从cmd运行生成的二进制文件,它可以工作:
sudo ./compiled-program
但是,我在程序(OpenCV)中使用了一些外部库。这是否意味着我将运行该程序的所有计算机都必须安装OpenCV?或者OpenCV捆绑在编译后的二进制文件中?它能在没有安装OpenCV的PC上工作吗?
发布于 2010-11-22 22:12:44
您应该阅读一些关于libraries的内容,特别是静态库和动态库之间的区别。引用基本定义,以便您了解要点:
静态库,也称为归档,由一组例程组成,编译器、链接器或绑定器将这些例程复制到目标应用程序中,生成目标文件和独立的可执行文件。
..。
动态链接是指在加载时或运行时将库的子例程(尤其是在Windows下称为DLL,在类Unix系统下称为DSO (动态共享对象))加载到应用程序中,而不是在编译时将它们链接到中。
发布于 2010-11-22 22:15:12
这根本不是一个愚蠢的问题!
“正常”的工作方式是,你的程序被链接到一个“共享库”上--在这种情况下,是的,用户需要OpenCV (或任何包含共享库的捆绑包)才能工作。
如果编译为静态可执行文件,(使用-static)标志,那么它和所有库都将直接包含到可执行文件中,这会使可执行文件变得更大,从而浪费更多内存,因为它没有使用共享库。
有一些方法可以让你的程序只链接静态的OpenCV库--但是只有当包中包含一个静态库".a“和一个共享库".so”时才能做到。
发布于 2010-11-22 22:16:43
如果你必须根据依赖来构建你的代码,比如OpenCV,这取决于你是做静态链接还是动态链接。
请看这里,其中有涵盖这些想法的部分:http://en.wikipedia.org/wiki/Library_(computing
对于初学者,请尝试在命令行中执行以下操作:
ldd compiled-program
您将得到如下输出(例如,我在/usr/bin
中对我的python
二进制文件执行了ldd
):
birryree@lilun:/usr/bin$ ldd python
linux-gate.so.1 => (0xb7ff7000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7fd5000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7fd1000)
libutil.so.1 => /lib/i686/cmov/libutil.so.1 (0xb7fcd000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7f82000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb7e2a000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7e16000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7df0000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7caa000)
/lib/ld-linux.so.2 (0x80000000)
Python需要很多额外的东西,比如libssl
(OpenSSL的一部分)、GNU库(libc
)和其他一些东西。
现在,如果您要将这个东西转移到其他系统,您要么希望他们有一个与您的环境类似的环境,将其作为源代码分发,并使用类似于autotools
/GNU构建系统的东西来构建它,要么您可以放弃所有这些,将所有内容静态链接到您的二进制文件中,这将带来您的可执行文件所需的所有内容,而不需要动态链接。
https://stackoverflow.com/questions/4250671
复制