«Неопределенные символы для архитектуры x86_64:« _add_number », ссылка из: (C) - PullRequest
0 голосов
/ 23 января 2020

В macOS С кодом Visual Studio я попытался скомпилировать C исходный код. (Ниже представлены 3 части исходного кода)

head.h (отредактировано)

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int add_number(int a, int b);

body. c

#include "head.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int add_number(int a, int b)
{
    return a + b;
}

main. c

#include "head.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int result = add_number (1, 2);
    printf("%d", result);
    return 0;
}

AND

gcc main.c

Однако, когда я нажал F5 в скомпилируйте этот код c, произошла следующая ошибка:

Undefined symbols for architecture x86_64:
  "_add_number", referenced from:
      _main in main-49215f.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Это сообщения об ошибке ссылки? Кто-нибудь поможет мне исправить эту ошибку? например, против настройки c или ...

PS Мои задачи против c. json ниже:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "gcc build",
            "command": "/usr/bin/gcc",
            "args": [
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "${file}"
            ],
            "options": {
                "cwd": "/usr/bin"
            },
            "problemMatcher": 
            { 
                "fileLocation": [ 
                "relative", "${workspaceRoot}" 
                ], 
                "pattern": 
                { 
                    // The regular expression. 
                    //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft' 
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$", 
                    "file": 1, 
                    "line": 2, 
                    "column": 3, 
                    "severity": 4, 
                    "message": 5 
                }
            },
        "group": "build"
        },
    {
        "label": "execute", 
        "command": "cd ${fileDirname} && ./${fileBasenameNoExtension}", 
        "group": "test"
    }
]
}

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Да, это ошибка компоновщика. Причина в том, что вы создали свое приложение с помощью

g cc main. c

, который имеет объявление add_number (от head. h), но нет определения, потому что модуль / модуль компиляции, который реализует эту функцию, отсутствует. Быстрое исправление:

g cc body. c main. c

1 голос
/ 24 января 2020

Когда вы

inline int add_number(int a, int b); // head.h

int add_number(int a, int b) { ... } // head.c

extern int add_number(int a, int b); // main.c

Тогда проблема все та же: код работает, потому что есть реализация add_number при условии, что вы скомпилируете, как в другом ответе, то есть с

g cc body. c main. c

Если вы вернетесь к предыдущей компиляции, которая выполняла только

g cc main. c

, реализация add_number по-прежнему отсутствует. Если вы хотите, чтобы функция была встроенной, удалите реализацию из head.c и сделайте это в head.h следующим образом:

static inline int add_number (int a, int b)
{
    return a + b;
}

и удалите прототип из main.c (обычно это плохая идея иметь external объявления в C -модулях, они должны go к заголовкам, чтобы все модули, включая заголовок, соответствовали прототипу).

В вашем особом случае после перемещения add_number от head.c до встроенной функции в head.h, файл C будет пустым, так что

g cc main. c

Работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...