【问题标题】:How to make my project easy to set up?如何使我的项目易于设置?
【发布时间】:2013-11-06 10:53:57
【问题描述】:

目前,我的应用程序的存储库包含 Visual Studio 11 项目文件、我的源文件和头文件、库头文件及其编译的 *.lib 文件和一些资产。

但是在每个新平台上建立项目以测试兼容性或继续开发是一项很大的工作。每次我必须为当前的 IDE 创建一个新项目时,更重要的是,下载所有使用的第三方库并为当前编译器编译 *.lib 文件。

有没有办法在所有平台上自动获取所需的库并将它们编译为 *.lib 文件?此外,涵盖项目设置会很愉快,这样可以更轻松地为新的编译器或 IDE 设置项目。

【问题讨论】:

  • 有一段时间以来有一个用于 C++ 的 NuGet,不确定它是否可以正常工作,但对您来说似乎值得一试?
  • @stijn NuGet 是跨平台的还是仅适用于 Windows 下的 Visual Studio?我访问了该网站,发现其中并未包含我的所有依赖项。
  • 可以用作独立的可执行文件,不确定它是否适用于 ion linux 等。这似乎表明它适用于 Mono:infoq.com/news/2013/05/nuget25

标签: c++ visual-studio compiler-construction automation dependencies


【解决方案1】:

我相信,CMake (http://www.cmake.org/) 是目前最好的 C++。与 C++ 本身一样,CMake 使用起来既不美观也不简单,但是,再次与 C++ 一样,它非常强大且用途广泛。

目前有大量需要自定义和/或复杂配置和构建的项目使用它。

以下是它的一些功能,您可能会觉得有用:

  1. 它不是构建工具。它生成将由本机构建工具使用的文件——Visual Studio 解决方案文件、GNU make 文件等等。它支持很多开箱即用的编译器——即 cl、gcc、clang。因此,这解决了您问题的“IDE”部分。
  2. 它有一个有用的find_package 宏,可帮助查找已安装的库以在项目中使用它。例如。如果你安装了 boost 库,你可以使用类似下面的代码,我相信这是相当自我描述的
    find_package( Boost COMPONENTS thread system)
    if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    link_directories(${Boost_LIBRARY_DIRS})
    endif(Boost_FOUND)
  3. 它有一个 ExternalProject 扩展,可以帮助自动下载、构建和安装库。例如。对于 zlib,将以下内容添加到您的 CMakeLists.txt:
    include(ExternalProject)
    ExternalProject_Add(
    ZLIB
    URL @987654322@
    )
    
    它将从给定的 url 获取 tarball,构建 zlib,并安装它。之后,您可以再次使用 find_package。
  4. 归根结底,CMake 是高度可定制的。您可以自定义 ExternalProject_Add 函数来更改下载、构建和安装规则。如果它也没有帮助,您可以随时调用curlgit clone 来获取源代码,然后手动调用构建和安装命令。

再说一次,它不是开箱即用的解决方案,但它可以完成工作,这一点得到了相当大的用户群的认可。套用一句已知的名言,“CMake 是最糟糕的构建工具,但其他工具更糟糕”

【讨论】:

  • 感谢您的回答,谢尔盖。对我来说,最重要的一点是处理外部库,以便轻松点击即可将它们安装在任何平台上。我可以忍受在我的存储库中包含所有内容,并且每个听说过为此使用子存储库。我已经使用过 Cmake,但据我所知,它缺乏自动依赖解析。
  • 是的,它没有内置的。您要求的是类似于“包管理器”的东西。 Python 有 pip,Haskell 有 cabal,Ruby 有 bundler,等等。但我不认为 C++ 有这样的东西。我知道至少 1 个具有相似目标的项目 - ryppl,但我并没有真正使用过它,也不认为它被广泛采用。因此,重复一遍,您可以通过合理的努力接近您所需要的 CMake。
  • 您给了我一个如何检测已安装库并使用它们的示例。但我的问题实际上是关于尚未安装库的情况。这是因为我的项目使用的比通常安装的库要多。您如何看待在我的存储库中包含所有第三方库?或者我可以在 Windows 上使用 apt-get 之类的 Linux 存储库来获取库源代码吗?
  • 我已经稍微更新了我的答案。请参阅 ExternalProject 包上的新项目符号。另外,我已经更改了最后一个项目符号中的措辞,以使其更加清晰
猜你喜欢
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多