vscode中使用extern關鍵字出現undefined reference to的問題
在按照c++ pp page255,嘗試在一個cpp檔案(翻譯單元)中定義具有外部連結性的靜態變數int x = 1,在另一個cpp檔案中用 extern int x;引用宣告時,執行會出現undefined reference to 'x'的錯誤。
兩個檔案分別如下:
接著F5編譯,出現:
這時候,我們排查錯誤應該看最下面控制檯中的紅框中的問題。
解決該問題,參考
https://blog.csdn.net/squall0984/article/details/107637986
https://blog.csdn.net/weixin_45514968/article/details/119153141
可以看出有兩個解決方法,本文不下載code-runner外掛,而採用第一篇文章的方法。
問題的原因是vscode預設只能單檔案編譯,因此在編譯 hello1.cpp時,並未編譯hello.cpp。
在tasks.json中修改:
tasks.json檔案中的args引數,實際上就是呼叫gcc時,後面所跟的引數在初始的配置中,實際上編譯器執行的命令為gcc -g main.c -o main.exe,而修改後的配置中,執行的命令是gcc -g main.c hello.c -o main.exe,這是由於引數${file}代表的是被編譯的當前檔案,而引數${fileDirname}\\*.cpp代表的是當前目錄下的所有.cpp檔案。
因此這樣修改之後,當前目錄下所有的cpp檔案都會被編譯;
修改好後執行,如下圖所示:
其中要注意的是,特意把hello.cpp和hello1.cpp單獨放在了externtest2的目錄下,這是因為如果放到有別的cpp檔案的目錄下,會將這些cpp檔案也一起編譯,這就會導致不同cpp檔案中的main()函式等發生衝突,如我們在hello.cpp中也加上main()函式:
接著編譯hello.cpp:
可以看到報錯,在hello1.cpp中重複定義了main()函式,main()函式在hello.cpp中就進行了第一次定義。
因此,在執行有多個cpp檔案的目錄中的cpp檔案時,還是將tasks.json中的配置改回來;在需要寫有關外部引用的程式時,需要單獨建立目錄來存放cpp檔案。