eas*_*sox 7 c++ visual-studio-code
我正在使用 VSCode 和代码运行程序扩展来尝试运行带有包含文件的简单 C++ 项目。
该项目由 main.cpp 组成:
#include <iostream>
#include <time.h>
#include "cval.hpp"
using namespace std;
int main(void)
{
putHello();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
hello.hpp 头文件:
#ifndef CVAL_H
#define CVAL_H
void putHello(void);
#endif
Run Code Online (Sandbox Code Playgroud)
还有 hello.cpp:
#include <iostream>
using namespace std;
void putHello(void){
cout<<"Hello"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我在 main.cpp 中定义putHello()
,代码就会编译。如果我包含#include cval.cpp
代码编译。
但是,当我仅包含cval.hpp
标头并使用代码运行器扩展时,出现以下错误:
Undefined symbols for architecture x86_64:
"putHello()", referenced from:
_main in main-a07db2.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
我知道这是一个我没有编译的问题cval.cpp
,因此链接器无法找到它并正确链接它。但是,有没有办法让 VSCode 自动编译标头中包含的文件?
我不想一直指定它或必须包含 .cpp 文件,并且它能够在我的 C 代码项目中包含这些文件而不会出现问题。
小智 5
有两种方法可以解决它。
在设置(cmd + ,)中,找到运行代码配置。
有一个选项卡“执行器映射”并打开“在settings.json 中编辑”。
然后您可以看到代码运行器扩展(执行器映射)的设置。
将cpp部分改成这样
"cpp": "cd $dir && g++ -o fileNameWithoutExt *.cpp && ./$fileNameWithoutExt"
Run Code Online (Sandbox Code Playgroud)
此代码编译当前目录中的每个 cpp 文件,因此标头将被正确包含。
这个解决方案的一个问题是,如果有其他带有main()的cpp文件,那么它将无法正确编译。
所以你最好为一个cpp程序使用一个文件夹。
我做了第二个解决方案来避免这个问题,但它只适用于mac(因为我在bash配置文件上创建了一个函数,并且我对powershell脚本语法不够熟悉,无法在Windows上创建该函数)
如果您使用 macOS,请尝试这个。
在 vscode 上,按 (shift + cmd + p) 并输入
Shell Command: Install 'code' command in PATH
Run Code Online (Sandbox Code Playgroud)
然后打开终端,输入
sudo code ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)
如果您使用 zsh,则键入
sudo code ~/.zshrc
Run Code Online (Sandbox Code Playgroud)
并复制粘贴此代码
function cppcompile()
{
filename=$1
re="^\#include \""
while read line
do
if [[ $line =~ $re ]]; then
temp=${line:9}
temp1=${temp#\"}
temp2=${temp1%\.*\"}
g++ -std=c++11 -c $temp2.cpp
fi
done < $filename.cpp
g++ -std=c++11 -c $filename.cpp
g++ -o $filename *.o
./$filename
rm *.o
}
Run Code Online (Sandbox Code Playgroud)
然后再次打开执行器图,将cpp部分改为
"cpp": "cd $dir && cppcompile $fileNameWithoutExt"
Run Code Online (Sandbox Code Playgroud)
cppcompile 函数将读取您的代码并查找标头,并编译标头和主代码。
因此它可以编译唯一的一个主代码和链接到该主代码的头文件,并且同一目录中是否有其他与主代码相同的cpp文件并不重要。
归档时间: |
|
查看次数: |
11941 次 |
最近记录: |