共享库中的外部库

时间:2012-11-07 10:05:39

标签: c++ g++ shared-libraries shared

我编写了一个基于其他几个库的c ++共享库。 现在,在使用库时,我得到了许多关于“外来”库函数的未定义引用。如果我明确地将'外部'库添加到g ++命令,编译和链接工作正常。有没有办法解决这个问题,以便图书馆用户不必手动链接“外国”图书馆?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果您不希望共享库的用户必须声明库的所有链接时依赖性,那么在构建共享库本身时,您可以通知链接器这些依赖项。

在Makefile中,它看起来像这样:

mylib.so:
    g++ -o mylib.so $OBJS -llib1 -llib2 -llib3

然后mylib.so的用户不需要指定lib1lib2lib3,但他们仍然需要提供(在正确的版本中)使程序能够运行。

答案 1 :(得分:0)

您应该从已发布(导出)的界面中排除所有外部数据类型和函数。这意味着,对于GCC,您可以使用-fvisibility=hidden隐藏所有实施细节,因此,仅使用attribute ((dllexport)导出您的部分。 Pimpl idiom(又名Opaque pointer)可帮助您从已发布的标头中删除依赖项。 下面的简单示例:

#include<memory>    

#if EXPORT_DLL
   #define DLL_PREFIX __attribute__ ((dllexport))
#else
   #define DLL_PREFIX __attribute__ ((dllimport))
#endif 

class XImpl;

class DLL_PREFIX X {
//...
private:
   std::unique_ptr<XImpl> impl_;
}

在另一个标头/来源中定义并实施您的XImpl,这就是全部。没有来自其他libs的链接依赖,仅来自你的。但运行时依赖性仍然存在!