注意:这个问题的目的是找出是否存在在 VC for Windows 中开发并将该代码顺利移植(意味着尽可能少地编辑代码)到 Linux 的标准方法系统,以便它可以编译成可执行文件并运行。
根据我收到的答复,我可以看出存在误解。因此,我要把这个问题分成两个单独的问题。一个是我原来的(修改后的问题),另一个是我的具体问题以及如何解决它。 (一旦发布,我将添加指向该问题的链接)。
注意:我对 C++ 和使用 makefile 进行编译还很陌生。
我一直在创建一个将在 Linux 服务器上运行的 C++ 程序,到目前为止我一直在使用 Visual Studio(Window 的当前版本)编写所有编码。为了安全起见,在开始编写程序之前,我尝试在 VC 中创建一些基本的 C++ 文件,将它们传输到我的服务器,然后用 g++ 编译它们并运行可执行文件。一切顺利,所以我想:
“嘿,我可以继续编写我的整个程序,遵循相同的过程,一切都会好起来的!”
很明显,我错了,这就是我来这里的原因。
当我运行我的 makefile 时,我遇到了很多错误,我不确定如何处理这种情况。大量错误消息似乎在暗示我使用了 vector (当然,用 VC 编译时运行良好)。
我看过以下问题:
How to compile in Visual Studio 2010 for Linux
Port Visual Studio C++ to Linux
Compiling Visual C++ code in Linux?
但我真的找不到直接解决我的问题的方法(例如,我宁愿避免在 Linux 平台上安装 VC,而是直接从那里开始工作)。
我也研究过(并尝试使用)wineg++但它在编译时似乎没有任何改变。
我该如何解决这个问题?
意思:在 Windows VC 上开发然后移植到 Linux 是常见的做法吗?如果是这样,是否有确保一切顺利进行的标准方法?或者只是了解 Linux 上的编译器如何工作并正确编码以防止错误发生的问题?
最好是一个允许我继续在 Windows 上开发并在完成后将所有内容移植到 Linux 的解决方案。此外,如果可能的话,尽量让任何答案都尽可能简单,我对其中的大部分内容仍然非常业余。
编辑:我还想提一下,我并没有真正使用任何疯狂的库。只是 math.h 和 vector。
一些错误的例子是:
用一些 double 初始化一个 vector :
对应的编译错误:
最佳答案
只要您以可移植的方式编写代码(不使用操作系统/编译器特定的功能,如 windows.h 或特定的编译器扩展)并使用可移植的库,它应该在 Visual Studio 和海湾合作委员会。
问题是,虽然它们都有效,但它们的工作方式略有不同。大多数情况下,它是不同的默认设置,您可能必须明确覆盖这些设置。例如:
Visual Studio 2017 及更高版本默认为 C++14。使用 /std指定不同标准的选项。
GCC 有一个默认设置,但允许您更改用于编译的标准。编译
g++ example.cpp
使用默认标准(GCC 版本 6 之前的 C++98 标准和版本 6 之后的 GCC 的 C++14)。您的代码似乎失败了,因为您使用了 C++11 功能,但您的编译器默认使用旧标准。<>
g++ -std=c++11 example.cpp
应该通过明确指定标准(在本例中为 C++11 标准)来消除一些错误。
>这些只是编译器选择的不同权衡。只支持一个标准可能会使支持和修复错误变得更容易,因为您没有不同的编译器 + 标准版本组合可能有不同的错误。能够更改用于编译的标准可以更轻松地测试程序是否适用于新标准或您必须修复哪些重大更改等...
一般来说,GCC 更像是最小化的,如果您希望它做一些额外的事情,您可以明确指定它。我建议使用类似的东西:
g++ -Wall -Wextra -pedantic -std=c++11 example.cpp
使用 -Wall 和 -Wextra 给出一个不错的警告级别开始 -pedantic 告诉你如果你正在尝试使用一个编译器扩展,它可以工作但会使你的代码的可移植性降低,最后但同样重要的是你应该总是指定你想要使用的标准,无论是 -std=c++11, - std=c++14 或较旧的 -std=c++98。
关于c++ - 如何在 Linux 上编译 Windows Visual C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37575454/
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f