C компиляция - 'undefined ссылка на функцию' при попытке связать файлы объектов

поэтому я создаю объектные файлы с помощью

cc -c MAIN.C
cc -c tablero.c

но затем, когда я пытаюсь связать их с исполняемым файлом с помощью

cc MAIN.o tablero.o

я получаю

undefined reference to `asdf()'

(функция определена в tablero.c и вызвана в MAIN.C)

вот мои файлы:

У меня есть MAIN.C

#include <stdio.h>
#include <cstring>
#include "tablero.h"
int main()
{
   int c;
   printf( "Enter a value :");
   c = getchar( );
   putchar(c);
   printf( "\nYou entered: ");
   c = asdf ();
   putchar(c);
   return 0;
}

У меня есть tablero.h

#ifndef TABLERO_H_
#define TABLERO_H_
int asdf();
#endif // TABLERO_H_

и у меня есть tablero.c

#include "tablero.h"
int asdf() {return 48;}; //48 is 0 in ascii

Ответ 1

Вы были укушены неясной особенностью инструмента cc для многих систем Unixy: файлы с суффиксом нижнего регистра .c скомпилированы как C, но файлы, суффикс которых имеет верхний регистр .c, скомпилированы как С++! Таким образом, ваш main (скомпилированный как С++) содержит внешнюю ссылку на имя искаженной функции, asdf() (aka _Z4asdfv), но tablero.o (скомпилированный как C) определяет только неподключенное имя asdf.

Вот почему вы смогли включить заголовочный файл С++ <cstring> в то, что предназначалось для программы C.

Переименуйте MAIN.C в MAIN.C (и измените <cstring> на <string.h>), перекомпилируйте main.o, и ваша программа должна соединить.

Если вы действительно хотите скомпилировать часть своей программы как C и часть как С++, вы можете аннотировать ваши файлы заголовков с помощью extern "C", чтобы совместить символы:

#ifndef TABLERO_H_
#define TABLERO_H_

#ifdef __cplusplus
extern "C" {
#endif

int asdf(void);

#ifdef __cplusplus
}
#endif

#endif // TABLERO_H_

Заголовочные файлы, подобные этому, должны быть особенно осторожными, чтобы содержать только код, имеющий тот же смысл в C и С++. Только типы POD, ни ключевые слова С++, ни ключевые слова C99, но не С++, без перегрузок и т.д.