Я пытаюсь добавить SQLite Amalgamation в мой проект. В соответствии с их страница, Я «Просто скопируйте объединение в ваш исходный каталог и скомпилируйте его вместе с другими файлами кода C в вашем проекте». Я также скопировал в sqlite3.h, поэтому у меня есть доступ к API.
Однако любой вызов функции API, например:
sqlite3 *db;
int rc;
rc = sqlite3_open("test.db", &db);
приводит к следующей ошибке:
Неверные аргументы
Кандидатами являются:
int sqlite3_open (const char *, * *) ‘DataSettings.cpp
/ FCS / SRC
строка 24
Семантическая ошибка
Что я здесь не так делаю? Что я забыл настроить?
Проблема имеет признаки несоответствия искажения имени. Поскольку C ++ допускает перегрузку функций на основе их типов аргументов, компиляторы C ++ должны «манипулировать» именами функций, которые они генерируют, в объектный код для кодирования типов аргументов. Компиляторы C не делают этого и не ожидают, что это будет сделано с ними. Указание компилятору C ++, что функция имеет связь «C», отключает искажение имени и перегрузку имени этой функции; Это то, что extern "C"
делает.
Хотя C во многих отношениях похож на подмножество C ++, оба являются разными языками. Лучше всего компилировать C-код с помощью C-компилятора. Поэтому одна из ваших альтернатив состоит в том, чтобы встроить источник C объединения sqlite отдельно от вашего кода C ++, например, в библиотеку, и связать его с вашими объектными файлами C ++, чтобы получить конечный исполняемый файл.