Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在编译时对功能进行选通? 我有一个C++应用程序正在开发中。我想发布一个免费版和一个付费版,生产版在现有免费版的基础上增加功能_C++_Cmake_Makefile - Fatal编程技术网

如何在编译时对功能进行选通? 我有一个C++应用程序正在开发中。我想发布一个免费版和一个付费版,生产版在现有免费版的基础上增加功能

如何在编译时对功能进行选通? 我有一个C++应用程序正在开发中。我想发布一个免费版和一个付费版,生产版在现有免费版的基础上增加功能,c++,cmake,makefile,C++,Cmake,Makefile,根据发布类型编译特性的最佳方法是什么?理想情况下,我会将一个标志传递给CMake,这样在构建二进制文件时,它也会包含我在生产版本中需要的任何代码。您自己回答了您的问题:)将一个标志传递给您的编译器,并在您的代码门中包含以下功能: #ifdef YOUR_FLAG //your extra logic #elif //in case YOUR_FLAG is not defined #endif 我在我开发的一个游戏中使用了完全相同的方法——在免费版本中启用广告,在付费版本中,代码被预处理器排除

根据发布类型编译特性的最佳方法是什么?理想情况下,我会将一个标志传递给CMake,这样在构建二进制文件时,它也会包含我在生产版本中需要的任何代码。

您自己回答了您的问题:)将一个标志传递给您的编译器,并在您的代码门中包含以下功能:

#ifdef YOUR_FLAG
//your extra logic
#elif
//in case YOUR_FLAG is not defined
#endif
我在我开发的一个游戏中使用了完全相同的方法——在免费版本中启用广告,在付费版本中,代码被预处理器排除


您也可以使用运行时检查,以防它更适合某些特定任务,但正如问题的注释中所述-代码在那里,篡改内存(翻转您的标志)可能会允许访问受限功能。

您将它们作为许可插件添加

即:

  • 把代码分开。见鬼,你甚至可以将“免费”代码授权为开源代码,并且仍然保持你的商业模式
  • 让他们给家里打电话或者核实一些密码,这样你们就知道那个人是有执照的
  • 确保代码的其余部分可以在删除付费内容的情况下继续使用。如有必要,舒适

  • #if(n)def
    宏化?通常代码总是在那里,但在启用额外的“生产版本”代码的功能之前检查某种验证。@JoachimPileborg这就是破解的原因。@BartekBanachewicz是真的,拥有一个“生产版本”就是盗版有效的原因。:)如果人们想使用你的软件而不付钱,他们会的,没有办法阻止它。他们要么“破解”一个许可副本,要么复制一个完全启用的程序,最终都无关紧要。所以我认为,这是最简单的!问题是,如果您想禁用多个组件的功能,这将变得很难管理。这确实会降低代码的可管理性,但这个问题可以而且应该通过正确使用良好的OOP实践来解决。举个例子:切换到组合并定义可切换功能所需的接口,创建两个类,实现此接口(纯虚拟类或您喜欢的任何其他类型的“接口”构造)(一个具有受限功能,另一个不受限制)然后在#ifdef块中,您只需实例化这两个接口实现中的一个。良好的OOP是王者,设计模式是他的忠诚骑士:)