首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Sublime Text 3 MacOS中运行C++程序

在Sublime Text 3 MacOS中运行C++程序
EN

Stack Overflow用户
提问于 2019-08-27 03:09:06
回答 3查看 1.5K关注 0票数 0

今年夏天,我参加了一个技术夏令营,学习了如何在Visual Studio中使用C++编程,但不幸的是,我家里没有Windows电脑。我试图让Visual Studio for Mac工作,但没有成功,决定尝试Sublime Text 3。我终于能够得到一个简单的"Hello World!“我最初在我的夏令营在Visual Studio中创建的程序。

代码语言:javascript
运行
复制
#include <iostream>
using namespace std;
int main()
{
    cout << "Hello World!" << endl;
}

但是当我尝试编写一个做同样事情的新程序时,而不是说Hello World!,它会说:

代码语言:javascript
运行
复制
ld: can't open output file for writing: /Users/David/Desktop/test, 
errno=21 for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)
[Finished in 0.4s with exit code 1]
[shell_cmd: g++ "/Users/David/Desktop/test.cpp" -o 
"/Users/David/Desktop/test" && "/Users/David/Desktop/test"]
[dir: /Users/David/Desktop]
[path: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/dotnet:/opt/X11/bin:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands]

我看了看文件夹,上面写着"Hello World!“我从Visual Studio转移过来的程序,里面有另一个文件,而不是打开终端的.cpp文件。首先显示两个文件路径,然后是exit;然后显示:

代码语言:javascript
运行
复制
Hello World!
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]

这是让我的新程序正常工作所需的文件吗?如何获取此文件?另外,我在使用Sublime Text 3时遇到的另一个问题是,我不能运行包含多个文件的程序。例如,如果我运行文件夹中的主.cpp文件,那么我在夏令营中制作的这个基于回合的文本游戏将只打印第一行。如果我运行.sln文件,它会出现如下错误:

代码语言:javascript
运行
复制
ld: warning: ignoring file /Users/David/Desktop/iD Tech C/David 
M/textTournament/textTournament.sln, file was built for unsupported 
file format ( 0xEF 0xBB 0xBF 0x0D 0x0A 0x4D 0x69 0x63 0x72 0x6F 
0x73 0x6F 0x66 0x74 0x20 0x56 ) which is not the architecture being 
linked (x86_64): /Users/David/Desktop/iD Tech C/David 
M/textTournament/textTournament.sln
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)
[Finished in 0.1s with exit code 1]
[shell_cmd: g++ "/Users/David/Desktop/iD Tech C/David 
M/textTournament/textTournament.sln" -o "/Users/David/Desktop/iD 
Tech C/David M/textTournament/textTournament" && 
"/Users/David/Desktop/iD Tech C/David 
M/textTournament/textTournament"]
[dir: /Users/David/Desktop/iD Tech C/David M/textTournament]
[path: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/dotnet:/opt/X11/bin:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands]

这是因为当我运行它(通过按command+shift+b)时,我选择了C++单文件-运行吗?如何运行多个文件?

下面是程序的文件夹:

https://docs.google.com/drawings/d/142bQ92Cr9lyS7ABap31ID-MkVn68IhdiyHXNfw_mDAk/view

(顺便问一下,如何在其中插入图像?)

EN

回答 3

Stack Overflow用户

发布于 2019-08-27 04:20:29

从下载XCode开始-这将安装整个开发环境。

您可以在XCode中进行开发。如果你更喜欢坚持使用Sublime -那没问题。

只需创建代码,将其保存在hello.cc中,并确保选择C++ build system。

Tools -> Build System -> C++ Single File

一旦你把代码放入编辑器中

代码语言:javascript
运行
复制
#include <iostream>
using namespace std;

int main() {
    cout << "Hello world!" << endl;
}

确保选择:Tools -> Build Width ...并选择Run

就这样。

尽管我是Sublime Text的铁杆粉丝(注意右上角缺少UNREGISTERED消息),但我还是建议在大量的C++开发中使用CLionXCode。否则,将很难调试代码。

CLion:https://www.jetbrains.com/clion/

XCode:https://apps.apple.com/pl/app/xcode/id497799835?mt=12

Visual Studio代码:https://code.visualstudio.com

票数 1
EN

Stack Overflow用户

发布于 2019-08-27 04:56:06

测试% ld:无法打开输出文件进行写入:/Users/David/Desktop/

,体系结构x86_64的errno=21

Errno21是EISDIR (在终端中使用man errno可以查看有关errno是什么以及值的含义的更多信息),这意味着它所说的路径是一个目录。根据所涉及的路径,我会猜测您的程序名为test.cpp,但桌面上还有一个名为test的文件夹,因此当链接器尝试创建最终应用程序时,它无法创建,因为它试图创建的文件是一个目录。如果是这样的话,重命名输入文件或删除/重命名test文件夹应该可以解决问题。

我看了看那个文件夹,上面写着"Hello World!“我从Visual Studio转移过来的程序,里面有另一个文件,而不是打开终端的.cpp文件。首先显示两个文件路径,然后是exit;然后显示:

这看起来像是Visual Studio生成的日志文件,可能是运行调试器的结果。因此,它允许您查看在您正在执行某些操作时发生了什么,但这并不是工作所必需的;如果您使用的是Visual Studio,它将根据需要重新创建这样一个文件。

另外,我在使用Sublime Text 3时遇到的另一个问题是,我不能运行包含多个文件的程序。

实际上,Sublime附带的C/C++构建系统,顾名思义,假定您只编译或编译并运行单个文件应用程序。它适用于小型、简单的应用程序/测试,因此任何包含多个源文件的内容都不在范围之内。

该构建系统包含以下两行(第一行仅用于编译,第二行用于编译和运行):

代码语言:javascript
运行
复制
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"",
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""

这里没有什么神奇之处;Sublime只是执行一个外部程序来完成这项工作。在这些行中,${file}将替换为您正在编辑的文件的名称。因此,如果您有两个文件,则需要在命令中硬编码其中一个或两个文件名。

这样做的结果是,每次在项目中添加/删除文件,需要更改编译器选项,或者切换到不同的项目时,都需要修改sublime-build文件以适应需要,这在某种程度上不是最优的。

另外,如果你的程序包含10个源文件,那么每次你改变一个文件,它将不得不重新编译所有的10个文件,即使它不需要这样做,这浪费了时间。

在这种情况下,您需要一个专用的构建自动化工具,比如make (或者类似的工具;有很多)。这些工具的作用是了解需要编译的内容以及如何创建所需的输出。如何使用make超出了Stack Overflow答案的范围,但是Sublime包含了一个开箱即用的构建系统,所以如果您遵循教程并创建一个Makefile,Sublime将会找到并使用它来构建您的程序。

例如,如果我运行文件夹中的主.cpp文件,我在夏令营制作的这个基于回合的文本游戏将只打印第一行。

这个有点不清楚,但听起来你的程序可以正常编译和运行,但似乎停止了?

如果是这样的话,你的问题是你不能在Sublime中直接运行一个交互式程序(在Sublime中,交互式意味着一个非gui程序,它允许你以任何方式与它交互,比如游戏),而不是使用某种第三方包。当Sublime运行一个程序时,它会捕获stdoutstderr (或者在C++中,它会捕获您发送给coutcerr的内容),但它不会将您在输出面板中键入的任何内容发送给应用程序(即cin不会执行任何操作)。

这样做的结果是,一旦你的程序到了问你问题的地步,它就永远挂起了;它在等着你告诉它该做什么,但你做不到。

使用Sublime中的第三方包(如Terminus )可以绕过这一点,尽管它要求您知道如何在终端中手动编译和运行程序才能设置它。

如果我运行.sln文件,它会出现如下错误:

sln文件是solution文件;它是Visual Studio用来帮助您管理应用程序的文件。它存储诸如项目中文件的名称、输出应该被命名等内容。

错误消息的要点是,它试图像运行可执行文件一样运行它,但事实并非如此。只有Visual Studio关心该文件(以及您的图像中概述的许多其他文件)。其中许多文件是由Visual Studio自己生成供自己使用的中间文件。当所有其他方法都失败时,只需考虑将cpph文件作为程序的源。

(顺便问一下,如何在其中插入图像?)

在编辑区域上方的工具栏中有一个按钮,允许您插入图像。

顺便说一句,Sublime不是与Visual Studio或XCode相同意义上的集成开发环境;这些工具是为编写软件而设计的,它们为设置项目提供了选项和指导,Sublime则更通用,需要您告诉它您想要它做什么。

这给了你很大的动力,但也需要你在一开始就进行更多的设置,如果你刚刚开始的话,这是一个额外的障碍。

票数 0
EN

Stack Overflow用户

发布于 2020-11-28 18:38:23

代码语言:javascript
运行
复制
{
  "cmd": ["bash", "-c", "/usr/bin/g++ '${file}' -std=c++11 -o '${file_path}/${file_base_name}' && open -a Terminal.app '${file_path}/${file_base_name}'"]
}

这是给Mac的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57663596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档