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

7

我正在使用VSCode和Code Runner扩展来尝试运行一个带有包含文件的简单c++项目。

该项目由main.cpp文件组成:

#include <iostream>
#include <time.h>
#include "cval.hpp"

using namespace std;

int main(void)
{


    putHello();

    return 0;
}

一个 hello.hpp 的头文件:
#ifndef CVAL_H
#define CVAL_H
void putHello(void);

#endif

这是 hello.cpp 文件:

#include <iostream>

using namespace std;

void putHello(void){
  cout<<"Hello"<<endl;
}

如果我在main.cpp中定义putHello()函数,代码将会编译通过。如果我包含#include cval.cpp,则代码也将编译通过。
然而,当我只包含cval.hpp头文件并使用Code runner扩展时,我会收到以下错误信息:
  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)

我了解这个问题是因为我没有编译 cval.cpp 导致链接器无法找到并正确链接它。然而,有没有一种方法可以让VSCode自动编译在头文件中包含的文件呢?

我不想一直指定它或者不得不将 .cpp 文件包含进来,在我的C代码项目中,这些文件都能够被成功包含。

2个回答

4

有两种方法可以解决这个问题。

在设置(cmd + ,)中找到“运行代码配置”。

有一个“执行程序映射”选项卡,打开“在settings.json中编辑”。

然后你就可以看到code-runner扩展(executor map)的设置。

将cpp部分更改为以下内容

"cpp": "cd $dir && g++ -o fileNameWithoutExt *.cpp && ./$fileNameWithoutExt"

此代码编译当前目录下的所有cpp文件,因此头文件将被正确包含。
这种解决方案的问题是,如果有其他带有main()的cpp文件,则无法正确编译。
因此最好为每个cpp程序使用一个文件夹。
我提供了第二种解决方案来避免这个问题,但它只适用于macOS(因为我在bash配置文件中创建了一个函数,我不熟悉powershell脚本语法,无法在windows上创建该功能)。
如果您使用macOS,请尝试此方法。
在vscode上,按下(shift + cmd + p),然后键入
Shell Command: Install 'code' command in PATH

接着打开终端,然后输入

sudo code ~/.bash_profile

如果您使用的是zsh,那么请键入以下命令:

sudo code ~/.zshrc

然后复制粘贴这段代码

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
}

然后再次打开Executor Map,并将cpp部分更改为:
"cpp": "cd $dir && cppcompile $fileNameWithoutExt"

cppcompile函数将读取你的代码并查找头文件,然后编译头文件和主代码。

因此,它可以编译唯一的主代码和与该主代码链接的头文件,而不管同一目录中是否有其他带有主函数的cpp文件。


0

谢谢,第一个解决方案对我有用,但是我必须在fileNameWithoutExt之前添加一个'$'符号:

"cpp": "cd $dir && g++ -o $fileNameWithoutExt *.cpp && ./$fileNameWithoutExt"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接