Затмение: 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++.

Другие вопросы по тегам