我编写了一个基于其他几个库的 c++ 共享库。现在,当使用该库时,我得到了很多关于“外国”库功能的未定义引用。如果我将“外部”库明确添加到 g++ 命令,编译和链接工作正常。有没有办法解决这个问题,以便图书馆用户不必手动链接“外国”图书馆?
谢谢你的帮助。
我编写了一个基于其他几个库的 c++ 共享库。现在,当使用该库时,我得到了很多关于“外国”库功能的未定义引用。如果我将“外部”库明确添加到 g++ 命令,编译和链接工作正常。有没有办法解决这个问题,以便图书馆用户不必手动链接“外国”图书馆?
谢谢你的帮助。
如果您不希望共享库的用户必须声明库的所有链接时依赖项,则可以在构建共享库本身时通知链接器这些依赖项。
在 Makefile 中,它看起来像这样:
mylib.so:
g++ -o mylib.so $OBJS -llib1 -llib2 -llib3
然后用户mylib.so
不需要指定lib1
,lib2
或lib3
,但他们仍然需要可用(在正确的版本中)才能使程序能够运行。
您应该从已发布(导出)的接口中排除所有外部数据类型和函数。这意味着,对于 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
在另一个标头/源中定义和实现您的,仅此而已。没有来自其他库的链接依赖,只有你的。但是运行时依赖仍然存在!