使用 VSCode Code Runner 编译 C++ 头文件

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文件并不重要。