我想在 GitHub 上启动一个 C++ 项目,以便能够在不同的操作系统(例如 OSX 和 unix)上克隆/构建。将需要安装许多依赖项(例如 curl、libxml2 等),并且我希望尽可能避免让用户需要在系统上手动安装这些依赖项。是否有可能做到这一点?
2 回答
这取决于你想咬掉多少。
简短的回答是让 CMake 完成这项工作。它将为任何平台生成项目,并且它们应该是可用的。您不需要为此分发二进制文件,假设它们随时可供您使用(以及对它们,通过扩展)。
这是一个设置我用于我的一个项目的 sqlite、boost 和 eigen 的示例。
cmake_minimum_required(VERSION 2.8)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Modules)
# boost
find_package(Boost 1.42.0 REQUIRED )
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
find_package(Eigen REQUIRED)
include_directories(${EIGEN_INCLUDE_DIRS})
find_package(Sqlite3 REQUIRED)
include_directories(${SQLITE3_INCLUDE_DIR})
set(CMAKE_CXX_FLAGS "-std=c++0x")
include_directories(.)
link_libraries(
${Boost_LIBRARIES}
${SQLITE3_LIBRARIES}
)
add_executable(igd_sqlite
main.cpp
)
您将使用它并生成 Visual Studio 项目、makefile 等。然后像往常一样构建项目。
CMake 支持许多开箱即用的库,尽管有时您必须在谷歌上搜索不太受欢迎的库并将它们添加到您的项目中。
我将它用于我的日常工作,即使我不需要跨平台。
当我确实想要分发二进制文件时,我通常会设置一个包含二进制文件的外部文件夹。
这是一个例子:
https://github.com/tomisarobot/curl_race
如果您没有很多外部依赖项并且它们不是很大,这将非常有用。如果不是这种情况,那么我建议将每个平台放在不同的存储库中。您的来源也应该是自己的。如果需要,您可以使用子项目,但这并不是绝对必要的。外部部门不会经常改变,所以它并不总是值得开销。通常我只是编写一个 bash 脚本来记录从哪里获取所有内容。无论如何,此脚本通常对于发行版构建是必需的。
像maven-nar-plugin这样的东西存在,虽然我不知道它的成熟度。如果您只是创建所有二进制文件以与您的源一起分发,那么它可能没有那么有吸引力。我没有看到很多关于它的讨论,所以我认为采用率很低。看过 maven 为 Java 做了什么,它应该更受欢迎。
几个想法
1) 工具
如果可能,将工具源包含在存储库中,以便可以将它们构建为仅第一次的步骤
如果不可能,请明确指定所需工具的最低版本,以便用户自己安装
- 可能通过运行脚本检查是否满足依赖项要求
2) 语言
以严格的语言合规性进行编译。例如
g++ -std=c++11 -pedantic