C Код, успешно использующий библиотеку Glib на windows, выдает ошибку компилятора / компоновщика на linux - PullRequest
0 голосов
/ 10 января 2020

У меня есть код, который использует библиотеку Glib для создания нового типа. Теперь код выглядит так:

.h file:

G_DECLARE_DERIVABLE_TYPE(NewTypeState, new_type_state, NEW, TYPE_STATE, ParentType)

.c file:

G_DEFINE_TYPE_WITH_PRIVATE(NewTypeState, new_type_state, NEW_TYPE_STATE)

теперь согласно glib do c для создания объекта мы должны определить две функции stati c как:

static new_type_init()

static new_type_class_init()

Но в коде вместо определения stati c new_type_init () самое интересное c. объявляется как:

__declspec(dllexport) extern void new_type_init()

и определяется как:

void new_type_init()
{}

И код успешно компилируется и связывается на windows, но при попытке построить на linux я удалил __declspec(dllexport) но я начал получать сообщение об ошибке:

stati c объявление следует за non-stati c объявление

Теперь я закомментировал объявление от .h файл и имеет только нестати c определение в файле. c, но при попытке его создания я получаю ошибку компоновщика:

неопределенная ссылка new_type_init

Я даже добавил extern к определению, но ошибка остается.

Может ли кто-нибудь объяснить вышеуказанное поведение?

РЕДАКТИРОВАТЬ :

o / p для objdump -t <file-name> | grep -i <symbol-name>:

000000000000b440 l     F .text  0000000000000023              symbol-name
0000000000000000         *UND*  0000000000000000              symbol-name

1 Ответ

0 голосов
/ 10 января 2020

Extern указывает, что функция будет доступна позже (т. Е. Здесь не определено в этой единице перевода). Stati c заставляет функцию быть недоступной извне. Добавьте extern к объявлению в заголовке и удалите stati c из определения, и вы можете добиться успеха. При этом я не знаю Глиба, поэтому не могу сказать наверняка.

...