如何在执行时将动态库链接到构建?

时间:2013-07-20 01:09:13

标签: macos dynamic-linking dynamic-library

我在OS X上,我有一个.so文件,我想在执行期间链接到.o文件。例如,在调用./Bar.o期间,Foo.so应该链接到Bar.o.我正在使用终端应用程序来运行我的应用程序,并使用Makefile编译了我的项目。

1 个答案:

答案 0 :(得分:0)

在Unix和OS X上,您可以使用libdl执行此操作。

基本思想是编译和链接可执行文件。在一些可能不同的时间和地点,可能不是你的人编译并链接共享库。如果在运行时,可执行文件可以获取共享库文件名的字符串以及要加载的函数的符号,则可以使用libdl获取包含共享库中函数地址的void *。在编译时,可执行文件必须知道相应的函数指针类型,因为下一步是将void *转换为"秘密预先安排的类型"可执行文件和动态加载的lib之间。铸造之后,你很高兴。

本教程介绍了动态加载函数的传统方法。类需要通过工厂函数进行间接。

http://www.tldp.org/HOWTO/html_single/C++-dlopen/

上面的方法是从哪里开始,但它的缺点是可执行文件和lib之间的所有通信必须通过使用extern" C"创建的C风格函数签名。在函数之前(最重要的是没有模板或重载)。这只是对可执行文件和lib之间通信端口的限制。两者都可以在内部使用C ++。如果你想在这里动态导入重载函数。

Dynamic Loading Without extern "C"

您必须小心用户定义的类。类的二进制表示在C ++中没有标准化。如果自定义类从可执行文件传递到lib但是可执行文件和库对于哪些位意味着什么有不同的想法,那么您将无法获得所需的行为。

另外,如果您在OS X上编译了共享库,那么您将拥有一个dylib,而不是。他们略有不同。

What are the differences between .so and .dylib on osx?