C++ 静态库是一个非常糟糕的可再发行组件。
这是一个 bot 切线,但这里应该提到 IMO。有许多编译器选项需要匹配调用者:
- Ansi/Unicode,
- 静态/动态 CRT 链接,
- 启用/禁用异常处理,
- 成员函数指针的表示
- LTCG
- 调试/发布
多达 64 种配置!
此外,即使您的 C++ 代码与平台无关,它们也不能跨平台移植——它们甚至可能无法与同一平台上的未来编译器版本一起使用!LTCG 创建巨大的.lib 文件。因此,即使您可以省略一些选项,您也拥有巨大的构建和分发规模,以及用户的通用 PITA。
这就是我不考虑购买任何只附带静态库的东西的主要原因,更不用说增加任何形式的复制保护的东西了。
实施思路
我想不出比 Shmoopty 的建议更好的基本机制。
您还可以为您的构建“添加水印”,这样如果您“在野外”检测到一个库,您就可以确定您将那个库卖给了谁。(但是,您要做什么?给潜在无辜的客户写愤怒的电子邮件?)此外,这需要一些努力,使用不影响执行的易于定位的字节序列不会有太大帮助。
您需要保护自己免受 LIB“解包器”工具的侵害。但是,链接器应该仍然能够删除未使用的函数。
一般想法
实施一个体面的保护机制需要非常小心和一些创造性,我还没有看到一个不产生额外支持成本并且需要艰难的社会决策的机制。花在复制保护上的每一小时都不是改进产品的一小时。C++ 代码的市场并不十分庞大,我看到您的客户需要为大量工作付费。
当我购买代码时,我很乐意为文档、支持、源代码和其他“面向未来”的迹象付费。没有那么多的许可。