首页 > 解决方案 > 如何在对象库中部分公开对象内容?

问题描述

我正在将一些 C++ 代码编译到库中。假设我的源文件是mylib.cpputil.cpp. 中的代码在util.cpp库实现中使用,但不是库的一部分,因为使用库的代码不能调用它(它不在公共头文件中)并且不应该知道它的存在;但my_lib.cpp包括util.hpp并且确实依赖于编译的util.cpp目标代码。

现在,如果我编译mylib.oand util.o,然后执行:

ar qc libmylib.a mylib.o util.o

我的图书馆工作得很好;但是 - 实用程序代码作为符号公开。因此,如果我将此库与其他代码链接,可能会出现双重定义的冲突。或者其他代码可能不恰当地依赖于可用的符号(例如,具有自己的标头)。

如何确保只有mylib.o(和util.o)中的目标代码“看到”来自 的符号util.o,而外部代码没有?

注意:我相信这个问题也代表 C 和其他编译语言。

标签: c++static-librariesvisibilityunix-armultiple-definition-error

解决方案


将评论转化为答案。

如果您的 C++ 库有自己的名称空间,那么使用该名称空间或子名称空间名义上是控制对内部实用程序的访问的正确方法。听起来好像您的代码没有提供模板类——必须单独考虑这些限制。

如果隐私是一个主要问题,我可能会考虑使用适当的命名空间控件将util.cpp(以及util.hpp)包含到mylib.cpp(含义#include "util.cpp")的源代码中,以便代码在util.cpp内部mylib.cpp而不是外部可用(使用匿名命名空间namespace mylib::Private或类似的命名空间)方案)。这不是很传统,但它可能是有效的(一旦你完成了必要的调整)。TU(翻译单元)的组合可能不会大到导致编译器出现重大问题。这不依赖于编译器扩展。


推荐阅读