我来自一个Windows本地开发的视觉工作室背景,我现在要编译用于android的本地代码。静态/动态库vs .so库?
我不确定unix类库(.so?)是如何工作的。它们是静态的(就像windows上的.lib)或动态加载像DLL一样? 例如,在Visual Studio中,我将.lib文件添加到我的项目中进行编译,然后在运行时加载.dll。通过使用GCC,unix-stuff中的等价物是什么?
谢谢!
我来自一个Windows本地开发的视觉工作室背景,我现在要编译用于android的本地代码。静态/动态库vs .so库?
我不确定unix类库(.so?)是如何工作的。它们是静态的(就像windows上的.lib)或动态加载像DLL一样? 例如,在Visual Studio中,我将.lib文件添加到我的项目中进行编译,然后在运行时加载.dll。通过使用GCC,unix-stuff中的等价物是什么?
谢谢!
在Linux上,.so文件与Windows上的.dll文件等效(*),因为它们在执行时被动态加载到可执行文件。但请注意,链接应用程序时不需要.lib文件。链接器将直接在.so文件中找到信息。
*:有差异。
有什么区别(显然格式除外)? – Mehrdad 2011-06-10 16:08:01
我能想到的主要原因是Linux .so文件可能具有未定义的依赖关系。他们将在运行时解决。 (在Windows上,它们需要在链接时解决。) – 2011-06-10 16:11:46
此外,Linux .so文件没有DllEntry函数,该函数在动态库由可执行文件加载/卸载时调用。 – 2011-06-10 16:12:51
。Linux上的Linux文件的行为与Windows上的.dll和Mac OSX上的.dylib的行为相同。
首先,您应该阅读Static, Shared Dynamic and Loadable Linux Libraries上的一个页面。
这应该澄清你的几个问题。该页面提供了对初学者很好的源代码示例。
另一个有趣的参考是Writing DLLs for Linux apps。
它们是动态的(共享对象) - http://en.wikipedia.org/wiki/Library_(computing)#Naming。 – MByD 2011-06-10 16:02:59
所以你不需要一个.lib等效的编译在unix开发中,只需加载动态库? – KaiserJohaan 2011-06-10 16:05:04
查看Didier的答案 – MByD 2011-06-10 16:07:30