web-dev-qa-db-ja.com

Visual Studioコードでコンパイラフラグを含める方法

FFTW機能を使用するVisual Studioコードデバッガで実行しようとしているプログラムがあります。コマンドでコンパイルします

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

未定義の参考文献を訴えずに私のコンピュータ上の端末に。ただし、launch.jsonファイルを生成した後、私のプログラムはFFTWライブラリ関数と-std=c++14コンパイラフラグについてコン訴されます。

私は、Visual Studioコードのデバッガの-std=c++11-lfftw3の余分なフラグが必要です。 MicrosoftのC/C++拡張子とコードランナー拡張機能を使用しています。

私はコードの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.

この質問をした方法で問題について教えてください。

6
MattSamm

簡単なオプションは、 を(== --- ==)argsとして渡す に渡します。

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

より維持的で共有可能なオプションは になることです(== --- ==)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を呼び出すだけです。

{
    "label": "build-all",
    "type": "Shell",
    "options": {
        "cwd": "${workspaceFolder}",
        "env": {
          ...
        }
    },
    "command": "make -f Makefile.x86_64",
}
 _

Env-依存パスがある場合は、MakeFileに変数を指定できます(例:MY_LIBS)そしてタスク設定のenvブロックに設定してください(例。"MY_LIBS": "/path/to/libs")。

MakeFileオプションの利点は、次のとおりです。

  • VSコードを使用しない人は、(コンソールまたは他のIDEから)コードをまとめることができます。
  • CI/CDパイプラインを使用している場合は、別の設定を必要としないため、VSコードでローカルに構築し、CI/CDを使用すると同じMakeFileを使用できます。
  • MakeFileをリポジトリにコミットしてから、ローカルtasks.json設定で環境変数を使用してENV固有の設定を指定するだけです。
10
Gino Mempin