Линковка C файла к СPP

К своему коду взял 2 файла (.h и .с ) отсюда https://github.com/christhechris/libscrc/blob/master/src/_crc16tables.h положил в папку

cmake не линкуется

add_executable(mycode main.cpp crc/_crc16tables.c )

с ошибкой

 undefined reference to `hz_calc_crc16_1021(unsigned char const*, unsigned int, unsigned short)'

Но если переименовать файл в cpp - собирается нормально.

Как правильно линковать c к cpp?


Ответы (1 шт):

Автор решения: user207200

Данная проблема связана с манглингом имен, который использует C++ компилятор. Для корректного поиска имен в объектном файле, скомпилированном компилятором C, компоновщику необходимо указать директиву extern "C". Можно обернуть как содержимое всего заголовочного файла, так и указать конкретную функцию.

#include <iostream>

extern "C" {
#include "_crc16tables.h"
}

int main() {
    auto src = reinterpret_cast<const unsigned char *>("test");
    std::cout << hz_calc_crc16_1021(src, 4, 32) << std::endl; // -> 7616
}

P.S. Параметры переданные в функцию выбраны случайным образом для проверки сборки.

→ Ссылка