【问题标题】:ld: symbol(s) not found for architecture x86_64 - Errorld:未找到架构 x86_64 的符号 - 错误
【发布时间】:2020-03-22 11:46:33
【问题描述】:

我正在尝试在 Mac OS Catalina 10.15.2 上的 VSCode 上运行代码。

我在这个函数上收到这个错误。

 $ g++ main.cpp
Undefined symbols for architecture x86_64:
 "nalea(int)", referenced from:_main in main-508a59.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see 
 invocation)   

这是我正在使用的主文件 -

#include<iostream>
#include "proba.h"
#include "constantes.h"
#include "affichage.h"

int main(){
int a = nalea(60);
std::cout<<a;
//int a = InitAffichage();
return 0;
}

这是调用函数的 proba.cpp 文件。

 #include <cstdlib>     // pour rand()
 #include <cstdio>      // pour fprintf()
 #include <cmath>       // pour floor()
 #include "proba.h"     // types et déclaration des fonctions


   int nalea( int max)
  {

       return (int)floor(rand()*((float)max)/RAND_MAX );
   }

这是 proba.h 头文件

     int nalea(int max);

请帮帮我,我是 C++ 新手....

【问题讨论】:

  • 您需要先发布编译器命令,然后才能有人帮助您。但是关于这个问题有上百万个问题,看看stackoverflow.com/q/12573816/9176689
  • 可能没有编译 proba.cpp。

标签: c++


【解决方案1】:

我已经多次遇到这种情况,并且在大多数情况下,它与路径中的空格有关。

您可以进行的简单测试是将项目放在路径中没有空格的文件夹中,例如您的用户主目录。

要修复它以便您可以将项目放在任何文件夹中,您需要首先制作一个包含构建信息的 tasks.json 文件,并根据 vscode https://code.visualstudio.com/docs/cpp/config-clang-mac 的指南编译所有 *.cpp

  1. 打开你的 main.cpp
  2. 进入菜单“终端”,选择“配置默认构建任务”
  3. 选择“C/C++:clang++ 构建活动文件”。你应该得到一个包含以下信息的 tasks.json 文件

    {
        "version": "2.0.0",
        "tasks": [
            {
                "type": "shell",
                "label": "C/C++: clang++ build active file",
                "command": "/usr/bin/clang++",
                "args": [
                    "-g",
                    "${file}",
                    "-o",
                    "${fileDirname}/${fileBasenameNoExtension}"
                ],
                "options": {
                    "cwd": "/usr/bin"
                },
                "problemMatcher": [
                    "$gcc"
                ],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            }
        ]
    }
    
  4. 现在关键部分是您应该将"${file}", 更改为"\"${workspaceFolder}\"/*.cpp",。注意两个\",这将确保处理路径中的任何空格,这在前面链接的vscode指南中没有提及

  5. 要构建,请转到菜单“终端”并选择“运行构建任务”或按“Shift+Cmd+B”

【讨论】:

    【解决方案2】:

    您只需编译所有 *.cpp 文件。您的编译命令应如下所示:
    g++ proba.cpp main.cpp [any other cpp files I don't know about]

    【讨论】:

      【解决方案3】:

      这可能是开始使用 C++ 时常见的“新手错误”。传统上,C++ 编译器会将单个 .cpp 文件中的代码编译成所谓的目标文件。

      目标文件包含编译器目标架构的本机代码,但不是可以直接运行的格式。要将目标文件转换为可执行文件,需要一个单独的链接阶段。链接器会将一组目标文件转换为可以运行的单个可执行二进制文件。

      传统上,单个文件的编译过程类似于

      g++ -c main.cpp
      ld main.o -lstdc++
      

      第一个命令生成目标文件main.o,第二次调用生成可执行文件的链接器(ld)使用该目标文件(在本例中使用默认名称a.out)。要将多个文件链接到同一个二进制文件中,可以使用

      g++ -c main.cpp
      g++ -c proba.cpp
      ld main.o proba.o -lstdc++
      

      g++ 命令不仅可以调用编译器,还可以使用上述的简写符号调用链接器。所以你的命令

      g++ main.cpp
      

      告诉编译器将main.cpp编译成一个临时目标文件,然后将它链接到可执行文件a.out

      如果你要跑步

      g++ main.cpp proba.cpp
      

      它将编译这两个文件并将它们链接到一个二进制文件中,这将解决您的问题。

      祝你学习顺利

      【讨论】:

        【解决方案4】:

        我认为您不能在 C++ 中引用另一个 * .cpp 文件。您可以将 proba.cpp 用作 .h,然后将其保存为库!如果我在英语中有错误,我很抱歉

        【讨论】:

        • 是的,我添加了一个头文件
        • 让他知道你在 .cpp 中写代码的地方。运气
        猜你喜欢
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 2020-06-20
        • 1970-01-01
        相关资源
        最近更新 更多