Использование заголовков C в C ++ - PullRequest
6 голосов
/ 20 августа 2011

Я искал в Google это и обнаружил, что вы используете

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

Чтобы включить библиотеку C в библиотеку C ++ ... однако, когда я делаю это. Кажется, что программа C ++ подхватывает все мои определения #defines и struct, но ни одно из объявлений функций не оставляет меня с неопределенной ссылкой на `function '.

Вот минимальное количество src, которое я использую.

json.h

//json.h
typedef struct json_object json_object;
struct json_object {
    char key[15][50];
    int size;
    char value[15][50];
};
void json_parseText(char * text, struct json_object *jo);

test.cpp

//test.cpp
extern "C" {
    #include "json.h"
}

int main() {
    struct json_object jo;
    char * keyVal;
    char * text = "{ \"MsgType\": \"article\" }";

    json_parseText(text, &jo);
}

g ++ дает следующее:

test.cpp:(.text+0x2c): undefined reference to `json_parseText'

обратите внимание, что он не жалуется на определение структуры, поэтому кажется, что он получил это из заголовочного файла. Но не функция. Это сбивает с толку меня. Я никогда раньше не использовал C ++, но для моей среды тестирования он должен быть в C ++. Дайте мне знать, если у вас есть мысли о том, как это исправить Спасибо.

1 Ответ

16 голосов
/ 20 августа 2011

Это ошибка времени соединения.Другими словами, ваш компилятор C ++ правильно выбрал ваш заголовок;вы просто забыли связать свою библиотеку.

Прямо сейчас вы говорите своему компилятору, что такие функции и структуры существуют, но не там, где он может их найти.

Для разделяемой библиотеки (.so) вам нужно будет передать -l[lib name] в G ++;вам также может потребоваться указать дополнительные папки в пути поиска библиотеки, поскольку -l требует имя файла (без расширения) вместо пути.Для статической библиотеки (.a) вам необходимо включить ее путь в файлы для компиляции.

...