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.
この質問をした方法で問題について教えてください。
簡単なオプションは、 を(== --- ==)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オプションの利点は、次のとおりです。