我在 OS X 上,我有一个 .so 文件,我想在执行期间链接到一个 .o 文件。例如 Foo.so 应该在调用 ./Bar.o 期间链接到 Bar.o。我正在使用终端应用程序来运行我的应用程序,并使用 Makefile 编译了我的项目。
1 回答
在 Unix 和 OS X 上,您可以使用 libdl 完成此操作。
基本思想是编译和链接可执行文件。在某个可能不同的时间和地点,某个可能不是您的人编译并链接了一个共享库。如果在运行时可执行文件可以获取共享库文件名的字符串和要加载的函数的符号,则可以使用 libdl 获取包含共享库中函数地址的 void*。可执行文件在编译时必须知道适当的函数指针类型,因为下一步是将 void* 转换为在可执行文件和动态加载的库之间“秘密预先安排”的任何类型。铸造后你就可以走了。
本教程展示了动态加载函数的传统方法。类需要通过工厂函数进行一些间接处理。
http://www.tldp.org/HOWTO/html_single/C++-dlopen/
上面的方法是从哪里开始的,但它的缺点是可执行文件和 lib 之间的所有通信都必须通过在函数之前使用 extern "C" 创建的 C 样式函数签名(最重要的是没有模板或重载)。这只是对可执行文件和 lib 之间通信端口的限制。两者都可以在内部使用 C++。如果您想动态导入重载函数,这是一种方法。
您必须小心用户定义的类。类的二进制表示在 C++ 中没有标准化。如果自定义类从可执行文件传递到 lib,但可执行文件和 lib 对哪些位的含义有不同的想法,您将无法获得您想要的行为。
此外,如果您在 OS X 上编译了共享库,那么您有一个 dylib,而不是一个 so。它们略有不同。