我编写了一个基于其他几个库的c ++共享库。 现在,在使用库时,我得到了许多关于“外来”库函数的未定义引用。如果我明确地将'外部'库添加到g ++命令,编译和链接工作正常。有没有办法解决这个问题,以便图书馆用户不必手动链接“外国”图书馆?
感谢您的帮助。
答案 0 :(得分:1)
如果您不希望共享库的用户必须声明库的所有链接时依赖性,那么在构建共享库本身时,您可以通知链接器这些依赖项。
在Makefile中,它看起来像这样:
mylib.so:
g++ -o mylib.so $OBJS -llib1 -llib2 -llib3
然后mylib.so
的用户不需要指定lib1
,lib2
或lib3
,但他们仍然需要提供(在正确的版本中)使程序能够运行。
答案 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的链接依赖,仅来自你的。但运行时依赖性仍然存在!