Затмение: C-код в C++ static lib, на который ссылается C++ lib, приводит к неопределенной ссылке
Я прочитал почти все темы "неопределенная ссылка" здесь, потратил 2 дня, пробуя разные варианты ссылок, но безрезультатно. Я в отчаянии!
Я работаю на платформе Linux Red Hat с Eclipse 3.6.1 и GCC 4.4.7.
Я портирую большой проект из студии Solaris (где он работает) на Eclipse. У меня есть проект C++ Static Library (например, Common_Lib), который включает в себя файлы преобразований.c + .h - чистый C-код.
Файл преобразование.h обернуто
#ifndef TRANSFORMATIONS_H_
#define TRANSFORMATIONS_H_
#ifdef __cplusplus
extern "C" {
#endif
void foo(int *x);
#ifdef __cplusplus
}
#endif
#endif
/* transformations.c */
#include "transformations.h"
void foo(int *x)
{
/* calculations on x*/
}
У меня есть другой C++ статический проект lib (например, Factory_Lib) с методом Do_Transform(), который вызывает foo () из transfors.h. Этот проект построен правильно.
#ifndef FACTORY_H
#define FACTORY_H
#include "transformations.h"
class CFactory
{
public:
void Do_Transform(int *x);
};
// factory.cpp
#include "factory.h"
void CFactory::Do_Transform(int *x)
{
foo(x);
}
И последний - исполняемый - проект C++ (например, Worker), который вызывает Do_Transform() Factory_Lib, который вызывает foo ().
#include factory.h
int main
{
CFactory fact = new CFactory();
int x=0;
fact.Do_Transform(&x);
return 0;
}
Работник отказывается быть собранным (связанным), появляется " неопределенная ссылка на foo () ".
Если вызов foo () выполняется напрямую из main () Worker, проблема не появляется!
В проекте Worker я пытался ссылаться на Common_Lib в ссылочных проектах, в настройках-> ссылки на компоновщик, как на дополнительные библиотеки -l в компоновщике без ссылочных проектов и т. Д. Я пробовал много комбинаций, но безуспешно.
Что я должен сделать, чтобы это работало?!?!? У меня закончились идеи.
Заранее спасибо!
2 ответа
Вы можете получить удачу следующим: -lFactory -lCommon
порядок важен.
Поскольку у вас есть код как Common_Lib, так и Factory_Lib, почему бы вам не скомпилировать оба с использованием самого общего компилятора C++. Я имею в виду компиляцию обеих библиотек в виде библиотеки C++ (не нужно никаких изменений кода, кроме как удалить extern "C" из translation.h)
Я не понимаю, зачем тебе нужен экстерн? Здесь не задействован компилятор C Обе библиотеки C++.