Связывание файлов / заголовочных файлов в C

#c

Вопрос:

У меня есть 2 файла c (и их заголовочные файлы). Я включил функцию «поместить» в соответствующий заголовок, но у меня все еще возникают следующие ошибки при вводе «gcc-o main main.c» в терминале.

main.c:(.text 0x389): неопределенная ссылка на коллекцию «put» 2: ошибка: ld вернул 1 статус выхода

могу я узнать причину? Как я должен изменить свой код?

Я попытался изменить порядок ссылок в файле makefile, но потерпел неудачу. Любой совет приветствуется, спасибо!

CMakeLists.txt

 cmake_minimum_required(VERSION 3.19)
project(Demo)

set(CMAKE_CXX_STANDARD 14)

include_directories(.)

add_executable(Demo
        main.c main.h KeyValueStore.c KeyValueStore.h )
 

главная страница.c

 #include "main.h"
...
int main() {
...
   if (strcmp("PUT", tokens[0]) == 0) {
      put(tokens[1], tokens[2]);
...
}
 

главная.h

 ...
#include "KeyValueStore.h"
...
 

KeyValueStore.c

 #include "KeyValueStore.h"

#define BUFSIZE 1024

typedef struct KeyValueStore {
    char key[BUFSIZE];
    char value[BUFSIZE];
} KV_Store;
KV_Store kvStore[BUFSIZE];

...

int put(char* key, char* value){
...
}
 

KeyValueStore.h

 ...
typedef struct KeyValueStore;
int put(char* key, char* value);
...
 

Комментарии:

1. Я думаю, что это ошибка компоновщика, и я думаю, что вы должны enable_language(C) в своем CMakeLists.txt Я нигде не вижу, чтобы ты так поступал. Кроме того, CMake-это генератор системы сборки, мы используем его для создания файлов создания, поэтому вы должны сказать CMake, чтобы он использовал ваш CMakeLists.txt для создания файла создания. Вы этого не делаете и не должны запускать команду вручную.

Ответ №1:

Проверьте, есть ли у вас файлы .o в этой папке, и удалите их, если есть. Возможно, компилятор в какой-то момент вышел из строя при компиляции, в результате чего остались *.o файлы, которые неправильно связаны

Ответ №2:

РЕДАКТИРОВАТЬ: Я неправильно истолковал вопрос, потому что по какой-то причине он возник для меня как вопрос на c 17. Я не уверен, что то, что я сказал, все еще применимо к C, хотя я знаю, что это работает с C . Извините за это всех, кто прочитал мой ответ до того, как я его отредактировал

Не уверен на 100%, что именно поэтому у вас возникла ошибка, хотя вам нужно поместить все файлы .c в компилятор.

Таким образом, в настоящее время вы пытаетесь «gcc-o main main.c«, где вместо этого вы хотите сделать что-то более похожее на «gcc-o main main.c KeyValueStore.c«.

Если вы не предоставите компилятору каждый файл .c, в нем не будет всех определений, и вы получите ошибку, аналогичную той, что у вас есть.

Я также не думаю, что вам действительно нужен main.h, предполагая, что там больше нет кода, на самом деле не стоит иметь целый дополнительный файл и вместо этого просто вставлять #include в main.c.

Комментарии:

1. Будет int *new = malloc(4*sizeof(int)) ли работать в файле .cpp? Я бы назвал это действительно плохой практикой-помещать код C в файл .cpp. C-это не C . Кроме того, в заголовке нет ничего плохого main.h , и это явно не вызывает проблемы.

2. О, подожди, я полностью запихнул это туда. По какой-то причине этот пост появился для меня под фильтром c 17, и я вроде как просто предположил, что весь код был на c . Я думаю, что то, что я сказал о заголовочных файлах, все еще применимо, хотя то, что я сказал о типах файлов, полностью мое, извините за это