Я прочитал почти все темы "неопределенной ссылки" здесь, потратил 2 дня на то, чтобы попробовать разные варианты ссылок, но без каких-либо результатов. Я в отчаянии!
Я на платформе Linux Red Hat с Eclipse 3.6.1 и GCC 4.4.7.
Я переношу большой проект из студии Solaris (где он работает) в Eclipse. У меня есть проект C++ Static Library (например, Common_Lib), который включает файлы transformations.c +.h - чистый код C.
Файл transformations.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() из transformations.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++ (например, Рабочий), который вызывает Factory_Lib Do_Transform(), который вызывает foo().
#include factory.h
int main
{
CFactory fact = new CFactory();
int x=0;
fact.Do_Transform(&x);
return 0;
}
Работник отказывается быть построенным (связанным), появляется неопределенная ссылка на foo().
Если вызов foo() выполняется непосредственно из main() Worker, проблема не появляется!
В проекте "Работник" я попытался ссылаться на проекты Common_Lib в Reference, в Settings-> Ссылки Linker, в качестве дополнительных библиотек -l в компоновщике без ссылочных проектов и т.д. Я пробовал много комбинаций, но безуспешно.
Что я должен сделать, чтобы он работал?!?!? У меня кончились идеи.
Заранее спасибо!
Вы можете получить удачу по следующему: -lFactory -lCommon
, порядок важен.
Поскольку у вас есть код как Common_Lib, так и Factory_Lib, почему вы не компилируете оба с использованием общего компилятора c++. Я имею в виду компилировать обе библиотеки как библиотеку c++ (без необходимости изменения кода, кроме удаления extern "C" из transform.h)
Я не понимаю, зачем вам здесь? Здесь нет компилятора C. Обе библиотеки - c++.