Ответ 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, но не С++, без перегрузок и т.д.