2013-07-20 36 views
0

我在OS X上,我有一个.so文件,我想在执行过程中链接到一个.o文件。例如,在调用./Bar.o期间,Foo.so应该链接到Bar.o。我正在使用终端应用程序来运行我的应用程序,并使用Makefile编译我的项目。如何在执行时将动态库链接到构建?

+0

通常你只是-l标志,例如编译'g ++ Bar.cpp -l Foo.so -o Bar.o'。这不行吗?为什么你需要将Foo.so链接起来?如果你可以发布你的Makefile,这将有帮助... – maditya

+0

我已经被建议这种方法。事情是,我的Makefile已经使用cmake生成,并且该项目非常大。根据我目前对Makefiles和cmake的了解,我无法找到链接发生的确切位置。 – shaveenk

+0

有没有办法在运行时链接? – shaveenk

回答

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,但是可执行文件和lib对于哪些位意味着什么有不同的想法,那么你不会得到你想要的行为。另外,如果你在OS X上编译你的共享库,你有一个dylib,而不是如此。他们有些不同。

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

相关问题