【问题标题】:CMake "make install" or including a library in windowsCMake“make install”或在windows中包含一个库
【发布时间】:2016-09-07 08:52:29
【问题描述】:

我正在尝试创建一个开源 C++ 项目。我希望它尽可能容易构建,但同时也是跨平台的。 我不需要 gui 或像 boost 或 Qt 这样的重型库,所以我决定使用 GitHub、CMake 和 LibSourcey。 我的问题是,我找不到让我的项目易于在 windows 中构建的方法,这是我的开发环境。 如何在 Windows 中“安装”一个库以在我的项目中使用?我什至必须在Windows中安装它吗? 是否可以自动下载、构建和链接?

在windows上,除了安装程序,我还想做一个便携版,所以不想要任何硬编码的库路径。

我假设,在某些平台上,例如 Linux,库是由维护人员单独构建和打包的。所以我不应该只是把自己的副本捆绑起来。

所以,我的问题是: 如何建立一个跨平台且易于构建的项目,最佳实践是什么?

【问题讨论】:

  • 我不确定您是否在谈论为您的开发过程或发布版本或两者寻找解决方案?在windows下可以使用msys2来管理你需要的包。
  • 我最近遇到了同样的问题,msys2 看起来不错,但我更喜欢使用原生工具链进行 windows 开发。
  • 我查看了 msys,但我希望它是原生的。使用 msys,为 x64 和适当的 unicode 支持编译更加困难。
  • MSYS2 提供原生和 POSIX 工具链。
  • 这个问题确实相当广泛,因为它既询问了开发方面,也询问了部署方面。 @GuillaumeRacicot - 鉴于您的赏金描述,我会说另一个关于您的详细信息(出口等)的问题真的更有意义。

标签: c++ windows github cmake cmake-gui


【解决方案1】:

你可以在你的 git repo 中创建git submodule 路径,例如 contrib/LibSourceryLibSourcery 的 github repo 的 url,因为 LibSourcery 使用 cmake 你只是 需要将这样的行添加到您的CMakeLists.txt:add_subdirectory(contrib/LibSourcery)

所以想要使用您的代码的人,只需git clone --recursive url 获取所有代码和依赖项,然后运行cmake -G,为他选择的IDE创建项目(当然包括MSVC++), 在IDE 中打开项目并按下构建按钮,仅此而已。

【讨论】:

  • 它似乎不起作用。我不知道是我做错了什么还是 LibSourcery 不支持这种类型的包含。我确实将它作为子模块包含在 contrib 文件夹中,但我仍然不确定这是否是在 Unix 平台上包含库的正确方法。如果可用,它会链接到已安装的库吗?它如何添加包含?
  • @denisps cmake 也以这种方式支持外部项目cmake.org/cmake/help/v3.0/module/ExternalProject.html
  • 这个答案似乎是最接近的。不幸的是,LibSourcery 似乎已被破坏并可能被遗弃。如果您详细说明在我链接到已安装在 Linux 上的库时如何考虑这种情况,我将不胜感激。
  • @denisps 如果已安装库,则没有通用答案。在最简单的情况下,当您处理Linux/usr/include 中的库头和/usr/lib 中的编译代码时,您只需将-llibname 添加到target_link_libraries 中。如果一些更复杂的东西,例如你不仅想要Linux 支持,或者库安装文件在/usr/lib /usr/include 的子目录中,你需要使用find_packagefind_library 和其他东西,以及你如何应该处理这种情况取决于库,以及来自 cmake 社区的某些人是否使用它的事实。
【解决方案2】:

使用babun。它是 cygwin 的包装器,它可以完美地满足我的一切需求,甚至可以使用 cmake 进行编译。

或者,您可以使用premake,它使用 lua 作为配置系统并且在 Windows 上运行良好。

【讨论】:

    【解决方案3】:

    没有优雅的跨平台方式,因为“make install”的想法在 Windows 上不存在,因此 cmake install 的使用在那里没有定义。对于应该有助于跨平台的东西,我觉得这是 cmake 的不足。

    我的解决方案是编写一个自定义 _INSTALL,它采用与 cmake install 相同的参数,然后在 Linux 上它只调用 install,在 Windows 上它执行一个 add_command,它对安装路径进行构建后复制,从而完成一样。基本上,_INSTALL 的行为方式与您期望跨平台安装命令的行为方式相同。有兴趣可以分享我的_INSTALL func。

    _INSTALL 被放置在 Helper.cmake 中,并包含在我所有项目的 CMakeList.txt 中,所以我需要做的就是调用它,生成的 lib/inc 文件会神奇地出现在 win 和 linux 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多