【问题标题】:How to include compiler flags in Visual Studio Code?如何在 Visual Studio Code 中包含编译器标志?
【发布时间】:2019-12-02 00:39:42
【问题描述】:

我有一个程序,我试图在使用 fftw 函数的 Visual Studio Code 调试器中运行。它使用命令编译

g++ dimer.cpp -std=c++11 -lfftw3 

在我的计算机上的终端上,而不抱怨未定义的引用。但是,在生成 launch.json 文件后,我的程序抱怨 fftw 库函数和 -std=c++14 编译器标志。

我相信它只需要 -std=c++11-lfftw3 的额外标志 让 Visual Studio Code 中的调试器正常工作。我正在使用 Microsoft 的 C/C++ 扩展和 Code Runner 扩展。

我正在尝试将 Mathematica 代码文档转换为 c++。

以下是我从输出中得到的错误。

Executing task: /usr/bin/g++ -g /home/msammartino/Documents/twochain/dimer.cpp -o /home/msammartino/Documents/twochain/dimer <

In file included from /usr/include/armadillo:54:0,
             from /home/msammartino/Documents/twochain/dimer.cpp:6:
/usr/include/armadillo_bits/compiler_setup.hpp:530:108: note: #pragma message: NOTE: suggest to enable C++14 mode for faster code; add -std=c++14 to compiler flags
 #pragma message ("NOTE: suggest to enable C++14 mode for faster code; add -std=c++14 to compiler flags")
                                                                                                        ^
/tmp/ccgb7Xsv.o: In function `r2r_dsine_fftw_forward_dimer(int, double*, double*, Eigen::Matrix<double, 2, 2, 0, 2, 2> (&) [2048], Eigen::Matrix<double, 2, 2, 0, 2, 2> (&) [2048])':
/home/msammartino/Documents/twochain/dimer.cpp:99: undefined reference to `fftw_plan_r2r_1d'
/home/msammartino/Documents/twochain/dimer.cpp:100: undefined reference to `fftw_plan_r2r_1d'
/home/msammartino/Documents/twochain/dimer.cpp:101: undefined reference to `fftw_plan_r2r_1d'
/home/msammartino/Documents/twochain/dimer.cpp:102: undefined reference to `fftw_plan_r2r_1d'
/home/msammartino/Documents/twochain/dimer.cpp:103: undefined reference to `fftw_execute'
/home/msammartino/Documents/twochain/dimer.cpp:104: undefined reference to `fftw_execute'
/home/msammartino/Documents/twochain/dimer.cpp:105: undefined reference to `fftw_execute'
/home/msammartino/Documents/twochain/dimer.cpp:106: undefined reference to `fftw_execute'
/tmp/ccgb7Xsv.o: In function `r2r_dsine_fftw_backward_dimer(int, double*, double*, Eigen::Matrix<double, 2, 2, 0, 2, 2> (&) [2048], Eigen::Matrix<double, 2, 2, 0, 2, 2> (&) [2048])':
/home/msammartino/Documents/twochain/dimer.cpp:166: undefined reference to `fftw_plan_r2r_1d'
/home/msammartino/Documents/twochain/dimer.cpp:167: undefined reference to `fftw_plan_r2r_1d'
/home/msammartino/Documents/twochain/dimer.cpp:168: undefined reference to `fftw_plan_r2r_1d'
/home/msammartino/Documents/twochain/dimer.cpp:169: undefined reference to `fftw_plan_r2r_1d'
/home/msammartino/Documents/twochain/dimer.cpp:170: undefined reference to `fftw_execute'
/home/msammartino/Documents/twochain/dimer.cpp:171: undefined reference to `fftw_execute'
/home/msammartino/Documents/twochain/dimer.cpp:172: undefined reference to `fftw_execute'
/home/msammartino/Documents/twochain/dimer.cpp:173: undefined reference to `fftw_execute'
collect2: error: ld returned 1 exit status
The terminal process terminated with exit code: 1

Terminal will be reused by tasks, press any key to close it.

如果我提出这个问题的方式有任何问题,请告诉我。

【问题讨论】:

标签: c++ visual-studio-code fftw


【解决方案1】:

简单的选择是pass them as args in your tasks.json configuration:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build-all",
      "type": "shell",
      "args": [
          "-std=c++11",
          "-lfftw3",
          "-L",
          "/path/to/libs",
          "/path/to/file.cpp"
      ],
      "command": "g++",
    }
  ]
}

更易于维护和共享的选项是create a Makefile 并将它们全部设置在那里:

# Specify compiler to be used
CXX = g++
CXXFLAGS += -g -std=c++11 -fPIC -march=x86-64

# Specify paths to headers
INCLUDES += -I include

# Specify paths to the libraries
LDFLAGS  += -L /path/to/libs

# Specify the link libraries
LLIBS    += -lfftw3

# ... add other configs ...

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(OBJ_DIR)
    $(CXX) -c $(CXXFLAGS) $(INCLUDES) $< -o $@

$(OBJ_DIR)/$(PROGRAM): $(OBJS)
    $(CXX) $(LDFLAGS) $^ $(LLIBS) -o $@

然后在你的任务配置中,调用make

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build-all",
      "type": "shell",
      "options": {
          "cwd": "${workspaceFolder}",
          "env": {
            ...
          }
      },
      "command": "make -f Makefile.x86_64",
    }
  ]
}

如果您有依赖于环境的路径,您可以在 Makefile 中指定一个变量(例如 MY_LIBS),然后在任务配置的 env 块中设置它们(例如 "MY_LIBS": "/path/to/libs")。

Makefile 选项的优点是:

  • 不使用 VS Code 的人仍然可以编译您的代码(从控制台或其他 IDE)。
  • 如果您使用 CI/CD 管道,则不需要单独的配置。您可以使用相同的 Makefile 通过 VS Code 在本地构建以及通过 CI/CD 构建。
  • 您可以将 Makefile 提交到存储库,然后只需使用本地 tasks.json 配置中的环境变量来指定特定于 env 的设置。

【讨论】:

  • 我发现这个链接有助于理解 Make 文件是什么。 cs.colby.edu/maxwell/courses/tutorials/maketutor
  • 我不确定我是如何打开我的 tasks.json 文件的,但它位于我的 VSC 文件目录中的一个隐藏的“.vscode”文件中。尝试运行调试器时出现权限错误。我需要包括 sudo 吗?如果需要,你知道该怎么做吗?我将如何在这个问题中附加我的 tasks.json 文件?
  • 这是 tasks.json 文件的预期位置,位于当前 VSCode 工作区的 .vscode 文件夹中。我觉得调试器需要sudo 有点奇怪...似乎某些文件、二进制文件或 VSCode 本身是以 root 身份安装的,而您没有访问这些文件的权限。您是否尝试过在 VS Code 之外编译代码?从控制台?
  • 我的代码在没有 sudo 的终端中编译得很好。我使用了“g++ dimer.cpp -std=c++14 -lfftw3”。当我调用 ./a.out 时,它似乎无限运行/没有完成运行。这会导致调试器出现问题吗?
  • 你不应该要求sudo 编译和运行,所以应该没问题。至于“无限运行”,这是您的应用程序现在的问题。调试器的行为方式相同,如果它在终端上无限运行,它也将与 VS Code 调试器一起无限运行。
猜你喜欢
  • 1970-01-01
  • 2021-06-20
  • 2018-01-01
  • 2013-01-02
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多