Я прочитал почти все темы «неопределенная ссылка» здесь, потратил 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 ++ (например, рабочий), который вызывает 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 в Референтные проекты, в Настройки-> Linker ссылки, как дополнительные библиотеки -L в компоновщике без Ссылочные проекты, и т.д. Я перепробовал много комбинаций, но безуспешно.
Что я должен сделать, чтобы это работало?!?!? У меня закончились идеи.
Заранее спасибо!
Вы можете получить удачу следующим: -lFactory -lCommon
порядок важен.
Поскольку у вас есть код как Common_Lib, так и Factory_Lib, почему бы вам не скомпилировать оба с использованием самого общего компилятора c ++. Я имею в виду скомпилировать обе библиотеки в виде библиотеки C ++ (не нужно никаких изменений кода, кроме как удалить extern «C» из translation.h)
Я не понимаю, зачем тебе нужен экстерн? Здесь не задействован компилятор C Обе библиотеки C ++.