【问题标题】:How to distribute CMake project without installation?如何在不安装的情况下分发 CMake 项目?
【发布时间】:2014-05-14 09:11:41
【问题描述】:

我的问题:我有一个库项目,我想以二进制形式分发。我希望我的客户能够尽可能轻松地将这个库与他们的项目集成。另外,我希望他们不必处理复杂的安装过程。我假设他们能够在初学者级别使用 CMake(这意味着添加头文件和源文件,find_package()add_executable())。

在最好的情况下,我会想象我的包的工作流程如下所示:

  • 仅下载带有头文件和二进制文件的包。无源,无 CMake,makemake install
  • 解压包。
  • 将内容移动到其他包所在的特殊目录。 (这个目录可以在环境变量或类似的地方。)
  • find_package() 有效。

在 Windows 7 和最新的 Ubuntu 中应该是这样的。

对我来说,过去 2 天我一直在学习 CMake,我发现文档非常难以理解(我在学习 Qt、qtcreator、sdl、pulse audio、git、OpenGL 等东西时从来没有遇到过这样的麻烦, ...) 这就是我要问的原因。

分辨率:

使用cmake的打包系统。

注意事项:

  • 当然,我在询问之前找到了这个解决方案,但是我犯了一个错误(使用 *Targets.cmake 文件作为安装树中的构建树)并认为它不适用于我的目的。
  • 我使用了包系统,但效果不佳,请查看相关问题。

相关问题:

编辑:

  • 将“find_library”引用更改为“find_package”,因为我在编写过程中弄错了这两个。
  • 添加了解决方案和相关问题部分。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    看看CMake packages

    这将完全允许您描述的用户工作流程。这里的想法是,当您构建项目时,CMake 将为您编写一个配置文件以随二进制文件一起提供。然后,您的用户可以在他们的 CMake 项目中加载该配置文件(使用 find_package),并且能够以最少的努力链接到您的二进制文件(通常一个简单的 target_link_libraries 调用就可以完成这项工作)。

    这种方法比经典的 find_library 方法更受欢迎,后者可能需要用户执行更多步骤才能启动和运行。

    关于你学习 CMake 的烦恼:我感受到你的痛苦。 CMake 本质上并不是特别容易学习。最重要的是,网络上可用的许多文档都严重过时了。我建议从 updated CMake reference manual 开始,它已针对即将发布的 CMake 3.0 版本进行了重组。仍然有很多内容需要挖掘,所以不要期望过快得到完美的结果,但这是一个很好的起点。

    【讨论】:

    • 首先,我必须道歉,我使用了“find_library”,而我的意思是“find_package”。
    • (对不起,我在完成之前发送了回复......)然后,非常感谢您对我的帖子的更正 - 显然,我不是以英语为母语的人,并且犯了比我应该的更多的错误...... . 所以,现在回答你:谢谢,我会调查一下——即使我在谷歌上搜索了几个小时,我也没有找到更新的手册。一般来说,我试图完全按照你的描述做,除了它需要安装步骤,包括写入注册表。所以我会看看你的链接,看看是否有帮助。
    • @Laethnes 祝您手册顺利。请记住,本手册已经适用于尚未发布的 CMake 3.0。大部分这些东西(包括包装)已经适用于 CMake 2.8.12,但如果您遇到问题,请务必仔细检查 the old manual 您尝试使用的功能是否已经存在。
    • 感谢并感谢您的警告 - 我已经发现 export(EXPORT ...) 是新功能的一个问题。因此,使用手册我能够得到一些结果,但问题是,我无法链接库(如果您有兴趣,测试项目在 dl.dropboxusercontent.com/u/41237813/ruzne/CMakeTest.zip 中) - 我创建了应该导出的 XyzLib 项目和索引(名称是完全随机的)作为使用它的可执行文件。错误是“没有规则来制作目标xyz-NOTFOUND', needed by Index.exe'。停止。”没有更多信息。我猜找不到库文件-我应该如何设置...
    • ...设置库项目,使 XyzLibTargets.cmake 包含必要的信息?我想我可以在 XyzLibConfig.cmake 中配置 link_directories() (就像我已经对包含所做的那样),但在那种情况下使用 ..Targets.cmake 将完全没有意义,不会......顺便说一句,我如何测试it: XyzLib: cmake-gui, mingw32-make, cpack -C CPackConfig.cmake -G ZIP,将生成的文件解压到前缀路径中的目录,然后在Index: cmake-gui, mingw32-make -> error.跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2018-06-03
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多