剖析你同事的论点
如果他认为将您的代码拆分为共享库会提高代码的模块化、可测试性和重用性,那么我猜这意味着他认为您的代码存在一些问题,并且强制执行“共享库”架构会纠正它.
模块化?
您的代码必须具有不希望的相互依赖关系,如果将“库代码”和“使用库代码的代码”分开,则不会发生这种情况。
现在,这也可以通过静态库来实现。
测试?
可以更好地测试您的代码,也许为每个单独的共享库构建单元测试,并在每次编译时自动化。
现在,这也可以通过静态库来实现。
代码复用?
您的同事希望重用一些未公开的代码,因为这些代码隐藏在您的单体应用程序的源代码中。
结论
第 1 点和第 2 点仍然可以通过静态库实现。 3 将使共享库成为强制性的。
现在,如果您有多个库链接深度(我正在考虑将两个静态库链接在一起,这些静态库已经编译链接其他库),这可能会很复杂。在 Windows 上,这会导致链接错误,因为某些函数(通常是 C/C++ 运行时函数,当静态链接时)被多次引用,并且编译器无法选择调用哪个函数。我不知道这在 Linux 上是如何工作的,但我想这也可能发生。
剖析你自己的论点
你自己的论点有些偏颇:
编译/链接共享库的负担?
与编译和链接到静态库相比,编译和链接到共享库的负担是不存在的。所以这个论点没有任何价值。
动态加载/卸载?
在非常有限的用例中,动态加载/卸载共享库可能是个问题。在正常情况下,操作系统会在需要时加载/卸载库而无需您的干预,无论如何,您的性能问题存在于其他地方。
使用 C 接口公开 C++ 代码?
至于为您的 C++ 代码使用 C 函数接口,我无法理解:您已经将静态库与 C++ 接口链接在一起。链接共享库也不例外。
如果您有不同的编译器来生成应用程序的每个库,您会遇到问题,但情况并非如此,因为您已经静态链接了您的库。
单个文件二进制更容易?
你是对的。
在 Windows 上,差异可以忽略不计,但仍然存在 DLL Hell 的问题,如果您将版本添加到库名称或使用 Windows XP,该问题就会消失。
在 Linux 上,除了上述 Windows 问题之外,您还知道默认情况下,共享库需要位于某些系统默认目录中才能使用,因此您必须在安装时将它们复制到那里(可能会很痛苦...)或更改一些默认环境设置(这也可能很痛苦...)
结论:谁是对的?
现在,您的问题不是“我的同事是对的吗?”。他是。你也是。
你的问题是:
- 您真正想要实现什么目标?
- 这项任务所需的工作是否值得?
第一个问题非常重要,因为在我看来,你的论点和你同事的论点都有偏见,导致得出对你们每个人来说似乎更自然的结论。
换一种说法:你们每个人都已经知道理想的解决方案应该是什么(根据每个观点),并且你们每个人都为达到这个解决方案而积累了论据。
没有办法回答这个隐藏的问题......
^_^