0

我在这里阅读了几乎所有“未定义的参考”主题,花了 2 天时间尝试不同的链接选项,但没有结果。我很绝望!

我在带有 Eclipse 3.6.1 和 GCC 4.4.7 的 Linux Red Hat 平台上。

我正在将一个大型项目从 Solaris 工作室(它工作的地方)移植到 Eclipse。我有 C++ 静态库项目(例如 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++ 静态库项目(例如 Factory_Lib),它使用方法 Do_Transform() 从 transformations.h 调用 foo()。该项目已正确构建。

#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),它调用 Factory_Lib 的 Do_Transform(),它调用 foo()。

#include factory.h

int main
{
   CFactory fact = new CFactory();
   int x=0;

   fact.Do_Transform(&x);

   return 0;
}

Worker 拒绝构建(链接),出现“ undefined reference to foo() ”。

如果直接从 Worker 的 main() 调用 foo(),就不会出现问题!

在 Worker 项目中,我尝试在Reference projects中引用 Common_Lib ,在Settings->Linker references 中,作为附加库-l在链接器中没有Referenced projects等。我尝试了很多组合,但没有成功。

我必须做什么才能使它工作?!?!?我已经没有想法了。

先感谢您!

4

2 回答 2

0

由于您拥有 Common_Lib 和 Factory_Lib 的代码,为什么不使用通用 c++ 编译器本身编译它们。我的意思是将两个库编译为 C++ 库(除了从 transformation.h 中删除 extern "C" 之外不需要更改代码)

我不明白你为什么在这里需要 extern?这里不涉及 C 编译器。这两个库都是 C++。

于 2014-03-03T13:25:55.043 回答
0

您可能会通过以下方式获得好运: -lFactory -lCommon,顺序很重要。

于 2014-03-03T13:36:12.013 回答