#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 . Я думаю, что то, что я сказал о заголовочных файлах, все еще применимо, хотя то, что я сказал о типах файлов, полностью мое, извините за это