草庐IT

C++ 构建过程

coder 2024-02-20 原文

我目前正在从事一个开源 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++ 构建过程的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  5. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  6. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  7. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  8. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  9. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  10. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

随机推荐