今年夏天,我参加了一个技术夏令营,学习了如何在Visual Studio中使用C++编程,但不幸的是,我家里没有Windows电脑。我试图让Visual Studio for Mac工作,但没有成功,决定尝试Sublime Text 3。我终于能够得到一个简单的"Hello World!“我最初在我的夏令营在Visual Studio中创建的程序。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
}
但是当我尝试编写一个做同样事情的新程序时,而不是说Hello World!,它会说:
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;然后显示:
Hello World!
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
这是让我的新程序正常工作所需的文件吗?如何获取此文件?另外,我在使用Sublime Text 3时遇到的另一个问题是,我不能运行包含多个文件的程序。例如,如果我运行文件夹中的主.cpp文件,那么我在夏令营中制作的这个基于回合的文本游戏将只打印第一行。如果我运行.sln文件,它会出现如下错误:
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
(顺便问一下,如何在其中插入图像?)
发布于 2019-08-27 04:20:29
从下载XCode
开始-这将安装整个开发环境。
您可以在XCode
中进行开发。如果你更喜欢坚持使用Sublime -那没问题。
只需创建代码,将其保存在hello.cc
中,并确保选择C++ build system。
Tools -> Build System -> C++ Single File
一旦你把代码放入编辑器中
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!" << endl;
}
确保选择:Tools -> Build Width ...
并选择Run
就这样。
尽管我是Sublime Text的铁杆粉丝(注意右上角缺少UNREGISTERED
消息),但我还是建议在大量的C++
开发中使用CLion
或XCode
。否则,将很难调试代码。
CLion:https://www.jetbrains.com/clion/
XCode:https://apps.apple.com/pl/app/xcode/id497799835?mt=12
Visual Studio代码:https://code.visualstudio.com
发布于 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++构建系统,顾名思义,假定您只编译或编译并运行单个文件应用程序。它适用于小型、简单的应用程序/测试,因此任何包含多个源文件的内容都不在范围之内。
该构建系统包含以下两行(第一行仅用于编译,第二行用于编译和运行):
"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运行一个程序时,它会捕获stdout
和stderr
(或者在C++中,它会捕获您发送给cout
和cerr
的内容),但它不会将您在输出面板中键入的任何内容发送给应用程序(即cin
不会执行任何操作)。
这样做的结果是,一旦你的程序到了问你问题的地步,它就永远挂起了;它在等着你告诉它该做什么,但你做不到。
使用Sublime中的第三方包(如Terminus )可以绕过这一点,尽管它要求您知道如何在终端中手动编译和运行程序才能设置它。
如果我运行.sln文件,它会出现如下错误:
sln
文件是solution
文件;它是Visual Studio用来帮助您管理应用程序的文件。它存储诸如项目中文件的名称、输出应该被命名等内容。
错误消息的要点是,它试图像运行可执行文件一样运行它,但事实并非如此。只有Visual Studio关心该文件(以及您的图像中概述的许多其他文件)。其中许多文件是由Visual Studio自己生成供自己使用的中间文件。当所有其他方法都失败时,只需考虑将cpp
和h
文件作为程序的源。
(顺便问一下,如何在其中插入图像?)
在编辑区域上方的工具栏中有一个按钮,允许您插入图像。
顺便说一句,Sublime不是与Visual Studio或XCode相同意义上的集成开发环境;这些工具是为编写软件而设计的,它们为设置项目提供了选项和指导,Sublime则更通用,需要您告诉它您想要它做什么。
这给了你很大的动力,但也需要你在一开始就进行更多的设置,如果你刚刚开始的话,这是一个额外的障碍。
发布于 2020-11-28 18:38:23
{
"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的
https://stackoverflow.com/questions/57663596
复制相似问题