c++ - 如何在对象库中部分公开对象内容?
问题描述
我正在将一些 C++ 代码编译到库中。假设我的源文件是mylib.cpp
和util.cpp
. 中的代码在util.cpp
库实现中使用,但不是库的一部分,因为使用库的代码不能调用它(它不在公共头文件中)并且不应该知道它的存在;但my_lib.cpp
包括util.hpp
并且确实依赖于编译的util.cpp
目标代码。
现在,如果我编译mylib.o
and util.o
,然后执行:
ar qc libmylib.a mylib.o util.o
我的图书馆工作得很好;但是 - 实用程序代码作为符号公开。因此,如果我将此库与其他代码链接,可能会出现双重定义的冲突。或者其他代码可能不恰当地依赖于可用的符号(例如,具有自己的标头)。
如何确保只有mylib.o
(和util.o
)中的目标代码“看到”来自 的符号util.o
,而外部代码没有?
注意:我相信这个问题也代表 C 和其他编译语言。
解决方案
将评论转化为答案。
如果您的 C++ 库有自己的名称空间,那么使用该名称空间或子名称空间名义上是控制对内部实用程序的访问的正确方法。听起来好像您的代码没有提供模板类——必须单独考虑这些限制。
如果隐私是一个主要问题,我可能会考虑使用适当的命名空间控件将util.cpp
(以及util.hpp
)包含到mylib.cpp
(含义#include "util.cpp"
)的源代码中,以便代码在util.cpp
内部mylib.cpp
而不是外部可用(使用匿名命名空间namespace mylib::Private
或类似的命名空间)方案)。这不是很传统,但它可能是有效的(一旦你完成了必要的调整)。TU(翻译单元)的组合可能不会大到导致编译器出现重大问题。这不依赖于编译器扩展。
推荐阅读
- java - 在 Java 中通过套接字流同步变量
- java - Android:如何在循环中使用相同的 AlarmManager?
- vue.js - 缓存 MP3 音频文件以供离线访问
- string - 詹金斯:如何从变量设置正文内容
- android - 如何从 Java 代码处理 Kotlin 中的泛型
- typescript - 使用带有联合类型签名的索引类型的意外行为
- mysql - sql join 查询数据库,没有想要的结果,
- android - 有没有办法从android中的键盘获取建议?
- javascript - 在 Angular 4 中刷新父组件视图
- android - Gradle 无法使用 Maven 块进行编译