Eclipse: C-код в C ++ static lib, на который ссылается C ++ lib, приводит к неопределенной ссылке

0

Я прочитал почти все темы "неопределенной ссылки" здесь, потратил 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 в компоновщике без ссылочных проектов и т.д. Я пробовал много комбинаций, но безуспешно.

Что я должен сделать, чтобы он работал?!?!? У меня кончились идеи.

Заранее спасибо!

  • 0
    Есть ли у вас файл #endif в файле transfors.h в самом конце?
  • 0
    Да, конечно.
Теги:
undefined-reference
gcc4.4

2 ответа

0
Лучший ответ

Вы можете получить удачу по следующему: -lFactory -lCommon, порядок важен.

  • 0
    Спасибо! Это решило мою проблему! Но я не понимаю почему. Можете ли вы объяснить логику этого?
0

Поскольку у вас есть код как Common_Lib, так и Factory_Lib, почему вы не компилируете оба с использованием общего компилятора c++. Я имею в виду компилировать обе библиотеки как библиотеку c++ (без необходимости изменения кода, кроме удаления extern "C" из transform.h)

Я не понимаю, зачем вам здесь? Здесь нет компилятора C. Обе библиотеки - c++.

  • 0
    Common_Lib, который является проектом C ++, содержит файлы на чистом C: transfors.c. Файл компилируется с помощью gcc вместо g ++. Код в нем - только C и должен оставаться только C.
  • 0
    Вы связались с обоими архивами во время работы? В остальном, я не вижу проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню