c++ - 部分更改 C++ 库同时保持库的其余部分完整的最佳实践

标签 c++

在像 OpenCV 这样成熟的 C++ 库中添加或修改单个类方法的最佳实践是什么,同时仍然重用库代码的其余部分,最好是 lib 格式。

在这一点上,我知道的唯一方法是将属于特定库(假设是 OpenCV 的核心库)的所有源文件和头文件复制到当前源文件夹,修改那个函数并用其余的重新编译模块的代码。理想情况下,我希望能够按原样链接所有当前 .lib 文件,但只需为这些库中定义的类定义一个新方法(或修改当前方法),我的方法实现将取代该方法默认库文件的实现。

继承似乎并不总是一种选择,因为有时基类具有正确的继承类实现所需的私有(private)成员。

最佳答案

我不知道在 C++ 中有一种干净的方法来完成您的要求。你真正要求做的(假定你需要使用或修改私有(private)方法)是违反封装的,而 C++ 语言旨在不允许你这样做。

存在几个选项:

  • .lib 文件只是.obj 文件的集合。您的编译器工具链应该有一个命令行程序,用于添加、删除和替换 .lib 中的 .obj 文件,因此您可以构建一个或两个 。 obj 文件并将它们合并到 .lib 中。我怀疑这个解决方案会很丑陋和脆弱。
  • 如果库没有做和应该做的事情,那么您总是有机会向库作者提交补丁或功能请求以进行更改。当然,如果它能奏效的话,这可能需要一段时间。
  • 作为@fatih_k建议,将您的更改添加为 friend 类会起作用。如果您对 OpenCV 所做的唯一更改是将 friend 行添加到头文件,那么库的 ABI将保持不变,您不必触摸 .lib
  • 最简洁的选择是简单地接受您需要修改 OpenCV 库并跟踪其源代码,连同您的修改以及您自己开发的源代码,并将它与您自己构建的源代码一起构建。这是一种非常常见的方法,有多种模式和技术可以帮助您做到这一点;例如,Subversion 有 vendor branches 的概念.这种方法需要更多的设置工作,但从长远来看绝对是最干净的。

关于c++ - 部分更改 C++ 库同时保持库的其余部分完整的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15640035/

相关文章:

c++ - 更改 vector 中对象的私有(private)变量

服务器端的 C++ TCP 套接字多次写入()在客户端被视为单次读取

java - 在 PCL 的 Project Tango 中可视化点云

c++ - 我可以使用 Windows 事件日志来调试应用程序吗?

C++ 理解类和构造函数

C++ 继承和成员函数指针

c++ - 何时调用使用 atexit() 注册的函数

c++ - 链表中节点的字段未解析

c++ - 安装一个库,以便 C++ 编译器可以直接访问它

c++ - 在 Windows C++ 应用程序中获取主线程的控制