2

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

谢谢你的帮助。

4

2 回答 2

1

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

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

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

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

于 2012-11-07T14:14:36.287 回答
0

您应该从已发布(导出)的接口中排除所有外部数据类型和函数。这意味着,对于 GCC,您可以使用-fvisibility=hidden隐藏所有实现细节,因此,仅导出具有属性((dllexport)的部分。Pimpl idiom (aka 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在另一个标头/源中定义和实现您的,仅此而已。没有来自其他库的链接依赖,只有你的。但是运行时依赖仍然存在!

于 2012-11-07T10:13:53.163 回答