1. 程式人生 > 其它 >vscode中使用extern關鍵字出現undefined reference to的問題

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檔案。