我应该如何在github上设置一个C ++项目,以便它可以移植?

时间:2013-04-06 02:57:00

标签: c++ github portability

我想在GitHub上启动一个C ++项目,这样我就可以在不同的操作系统上克隆/构建(例如,OSX和unix)。将需要安装许多依赖项(例如curl,libxml2等),并且尽可能地避免让用户需要在系统上手动安装deps。有可能这样做吗?

2 个答案:

答案 0 :(得分:4)

这取决于你想吃多少。

简短的回答是让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 :(得分:1)

几点想法

1)工具

  • 如果可能,请在存储库中包含工具源,以便可以将其构建为首次执行的步骤

  • 如果不可能,请清楚指定所需工具的最低版本,以便用户自行安装

    • 可能通过运行脚本来检查是否满足依赖性要求

2)语言

编译严格的语言合规性。例如

   g++ -std=c++11 -pedantic