C++ 构建过程

标签 c++ build-process

我目前正在从事一个开源 C++ 项目。我在 C++ 方面没有太多经验,因为我的日常工作主要涉及 Java。我现在打算发布我的C++项目,我想知道我应该如何安排我的项目的打包。例如,在 Java 中,所有的类文件都打包成 jar 文件。那么 C++ 中的等效方法是什么?组织源代码/二进制文件有什么好的做法吗?顺便说一下,我的目标平台是 Linux。

另一个问题是我目前正在使用 Eclipse CDT 插件进行开发和构建。那么我是否可以从 Eclipse 项目中提取构建脚本并将其用作通用构建脚本?关于 C++ 构建/打包有什么好的引用吗?提前致谢。


已编辑

再澄清一点,我认为我的项目的发布可以被视为一个应用程序。它是用于软件配置管理的命令行工具。

最佳答案

I am currently working on an opensource C++ project.

这简化了很多事情。您应该为您的项目提供构建脚本并支持它们用于不同的用例(了解 Makefile,有类似的概念,如“目标”)。

I don't have much experience in C++ as my daily job mainly involves with Java.

您过去在 Java 中拥有(并且现在要求)的大多数东西都是发明的,因为它们缺少 C/C++。至少学习一些关于动态(共享)/静态库(.so 和 .a 文件很简单)的知识。

I am now planning to release my C++ project and I would like to know how should I should I arrange the packaging of my project.

“C++ 项目的打包”是非正式的。您可以为知名的 IDE 提供源代码、构建脚本和一些项目文件。

编辑:您已指定要构建命令行应用程序。我相信您所需要的只是为该应用程序从一个简单的 Makfile 开始。引用 Makefile 可以由 Eclipse 自动生成。如果您计划将您的应用程序部署为独立软件,那么您必须了解打包(rpm、deb、tgz)。

E.g, in Java, all the class files are packaged into jar file.

没有跨编译器兼容的 C++“包”之类的东西(即使是“模块”在最新的 C++11 标准中也被拒绝了) 因为没有二进制标准来编码 C++ 类 (ABI)。在 Linux 上,您很可能会使用 GCC(或 Intel 的编译器,或 LLVM 的 CLang,或 OpenWatcom 的自定义构建或...), 但是您链接到的标准库版本使二进制版本的发布几乎无用。 这就是重新发布源代码的原因。

So what is the equivalent approach in C++?

这里没有明确的答案。

Is there any good practise for organizing the source code/binary?

看看大型项目,看看他们组织构建的方式。 “构建工程师”这个职业强调了大型项目编译/链接的困难。

My target platform is Linux by the way.

这也是一个不完整的描述。 “Linux”是一个模糊的术语。你应该谈谈 Linux 发行版、编译器工具链和包管理器。例如,Ubuntu 12、amd64、GCC 4.6 工具链、APT 包管理器。

围绕同一个内核源代码构建了不同的“linuxes”。有不同的编译器。至少要考虑三个主要的包管理器:Debian/Ubuntu(deb,apt)、Red Hat(rpm)、Slackware(tgz)。

Another question is I am currently using Eclipse CDT plugin for development and building. So is there anyway that I can extract build script from Eclipse project

有一种“元技术”:您编写项目的“描述”,然后工具生成项目文件并为您的源构建脚本。看看CMake .由于您使用的是“linux”,请尝试查看 autotools (autoconf) 的标准方式。

Is there any good reference regarding C++ build/packaging?

您应该先构建应用程序,然后再处理部署问题。 C/C++ 是一种难以学习的传统,具有许多 Java 中避免的微妙之处。

关于C++ 构建过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11554632/

相关文章:

c++ - 是否有任何 IID_XXX 可以从 Internet Explorer 获取焦点选项卡?

c++ - 哪些 C++0x header 应该定义 nullptr?

c++ - 通过 http 代理 boost asio ssl 身份验证

java - 为什么使用Gradle代替Ant或Maven?

ios - XCode 中 ios 应用程序的确切构建过程是什么?

iphone - 命令行编译 iPhone 应用程序

javascript - 使用 Grunt.js 迭代完全独特但重叠的主题文件

c++ - 从进程外,从 IE 实例获取 IWebBrowser2 接口(interface)的正确方法是什么?

c++ - 从其行和列的给定总和生成一个二维整数数组

c++ - Eclipse-CDT:添加自定义构建步骤的最佳方式是什么?