Включение функций с внешней связью C в библиотеке - PullRequest
0 голосов
/ 22 июня 2011

Я включил некоторые функции C со связью extern c в коде c ++. Например.

// File Y.cpp: 

extern C {  
 void fnA(void) { }  
 void fnB(void* a, void* b) { }  
}

class test {
....
};

// end of file

Файл Y находится в модуле Mod. При сборке библиотеки libMod-O.a для модуля Mod я не вижу включенных функций в блоке extern, если только Y.h не включен в какой-то другой файл (Mod.cpp) и не используется тест класса. Поэтому, если я не создаю объект тестового класса в Mod.cpp, я не вижу функции extern (fnA, fnB) в libMod-O.a, даже если Y.cpp компилируется во время сборки libMod-O.a. В результате возникает ошибка компоновщика, так как другой модуль использует fnA, fnB.

Я не вижу связи между внешними функциями fnA и fnB и использованием теста класса в Mod.cpp. Это ожидается или есть лучший способ определить это?

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Вы, конечно, имеете в виду extern "C".

Вам необходимо четко разделить код C и код C ++.

В YourCCode.h:

#ifdef __cplusplus
extern "C" {
#endif

void fnA(void);
void fnB(void* a, void* b);

#ifdef __cplusplus
}
#endif

В YourCCode.c:

void fnA(void) {}
void fnB(void* a, void* b) {}

Убедитесь, что ваш компилятор компилирует YourCCode.c как C, а не как C ++.

В вашем коде C ++

#include "YourCCode.h"

fnA();
// etc.
1 голос
/ 22 июня 2011

у вас может быть проблема с порядком ссылок, когда файлы, использующие fnA, идут после ссылки на libMod-Oa, но где Mod.cpp с проверкой объекта предшествует libMod-Oa, поэтому файл obj загружается до того, как потребуется fnA / fnB потом. компоновщик GNU по умолчанию является однопроходным компоновщиком.

...