C++编译报错:symbol(s) not found for architecture arm64 求助
解决C++多文件编译的链接错误(Undefined symbols)
你遇到的是链接阶段错误:编译器只编译了main.cpp,但card类的构造函数实现放在deck.cpp里,链接器找不到这个函数的二进制实现,所以报Undefined symbols。
解决方案1:修改手动编译命令
把deck.cpp也加入编译命令,让g++同时编译两个源文件并完成链接:
g++ -fdiagnostics-color=always -std=c++11 -g /Users/######/vscode/blackjack/main.cpp /Users/######/vscode/blackjack/deck.cpp -o /Users/######/vscode/blackjack/main
g++会先分别编译main.cpp和deck.cpp生成目标文件(main.o、deck.o),再由链接器把它们合并成可执行文件。
解决方案2:配置VSCode自动编译
如果你用VSCode的默认编译任务,需要修改.vscode/tasks.json,把deck.cpp加入编译参数:
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: g++ build active file", "command": "/usr/bin/g++", "args": [ "-fdiagnostics-color=always", "-std=c++11", "-g", "${file}", "${workspaceFolder}/deck.cpp", // 新增该行,引入deck.cpp "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true }, "detail": "编译器: /usr/bin/g++" } ] }
之后点击VSCode的"运行生成任务",就会自动同时编译两个文件。
额外优化:添加头文件保护
为避免头文件被重复包含导致编译问题,建议给deck.h加上头文件保护:
#ifndef DECK_H #define DECK_H #include <iostream> namespace deck_base { class card { public: card(); int val = 0; }; } #endif
内容的提问来源于stack exchange,提问作者trichedout
相关产品推荐
相关产品推荐

