我应该如何在github上设置c++项目,使其可移植
How should I setup a C++ project on github so that it is portable?
我想在GitHub上启动一个c++项目,这样我就可以在不同的操作系统(例如,OSX和unix)上克隆/构建。需要安装很多依赖项(例如curl、libxml2等),并且我希望尽可能避免用户需要手动在系统上安装深度包。这可能吗?
这取决于你想咬多少。
简短的回答是让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项目、makefiles等。然后像往常一样构建项目。
CMake支持很多开箱即用的库,尽管有时你必须谷歌不太受欢迎的库并将它们添加到你的项目中。
我在日常工作中使用它,即使我不需要跨平台。
当我确实想要分发二进制文件时,我通常会为二进制文件设置一个外部文件夹。
下面是一个例子:
https://github.com/tomisarobot/curl_race如果你没有很多的外部依赖,如果它们不是很大,这是非常有效的。如果情况并非如此,那么我建议将每个平台放在不同的存储库中。你的信息来源也应该是独立的。如果需要,您可以使用子项目,尽管这不是必须的。外部深度不会经常改变,所以它并不总是值得的开销。通常我只是编写一个bash脚本来记录从哪里获得所有东西。无论如何,这个脚本通常是构建发行版所必需的。
像maven-nar-plugin这样的东西是存在的,尽管我不知道它是否成熟。如果您只是创建所有的二进制文件,以便与源代码一起分发,那么它可能就不那么吸引人了。我没有看到很多关于它的讨论,所以我认为采用率很低。看到maven为Java做了什么,它应该更受欢迎。
几点思考
1)工具在可能的情况下,将工具源包含在存储库中,以便可以将它们作为第一次构建的步骤
如果不可能,明确指定所需工具的最低版本,以便用户可以自己安装它们
- 可能通过运行脚本检查是否满足依赖项要求
严格遵从语言进行编译。例如
g++ -std=c++11 -pedantic
- 使外部项目可用于find_package CMake
- C++Union/Struct位域的实现和可移植性
- 具有Qt事件循环的可移植通用共享库设置
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- 如何在 c++ 中正确指定 #include 路径以使程序可移植
- 创建异构顶点数据数组的可移植方法
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 静态库可移植性
- 从非类型模板参数声明 constexpr 数组的可移植方法
- C++:Unicode 字符串文字的可移植性
- 如何使Visual Studio 2017 C++项目在计算机之间更具可移植性
- 尝试将 sfml 和 c++ 与 Windows 10 上的可移植 vscode 链接起来
- 在C++中获取命名空间名称的任何可移植技巧
- 使用Visual Studio项目使Opencv可移植,并删除链接错误
- C++/CLI 项目如何引用可移植类库
- 嵌入式C++项目 - 需要支持智能指针.可能的可移植性问题
- Windows Metro c++ c# -如何添加WinRT可移植项目的命名空间
- 我应该如何在github上设置c++项目,使其可移植
- 从现有项目生成exe包(可移植)
- 将使用位域的大型项目转换为更可移植的内容