【问题标题】:Link .o (C object file) to C++ file/project on Linux将 .o(C 对象文件)链接到 Linux 上的 C++ 文件/项目
【发布时间】:2011-09-13 09:46:01
【问题描述】:

我对 linux 中的 .o 文件有如下问题:

我有调用函数 ECL_Drawrect() 的 Visual.cpp,这个函数定义为:

#define ECL_Drawrect ECL_bDrawrect

在我的 Visual.cpp 中,我还将“ecl.h”包括为:

#include "ecl.h"

int main() {
    ECL_Drawrect (0,0,20,20,false);
    return 0;
}

问题是函数 ECL_bDrawrect 在 ecl.o 文件中,我不知道如何链接它以使用上述函数。

经过一番研究,我发现并设置如下:

g++ Visual.cpp -o Visual /usr/include/ecl.o

ecl.o 路径也包含在我的项目中,编译时出现此错误:

**** Build of configuration Debug for project Visual ****

make all 
Building file: ../src/Visual.cpp
Invoking: GCC C++ Compiler
g++ -m32 -O0 -g3 -Wall -c -fmessage-length=0 /usr/include/ecl.o -MMD -MP -MF"src/Visual.d" -MT"src/Visual.d" -o "src/Visual.o" "../src/Visual.cpp"
g++: /usr/include/ecl.o: linker input file unused because linking not done
Finished building: ../src/Visual.cpp

Building target: Visual
Invoking: GCC C++ Linker
g++ -m32  -o "Visual"  ./src/Visual.o   
/usr/bin/ld: ./src/Visual.o: in function main:../src/Visual.cpp:7: error: undefined reference to 'ECL_bDrawrect'
collect2: ld returned 1 exit status
make: *** [Visual] Error 1

**** Build Finished ****

不知道链接对不对?如何正确链接此 ecl.o 文件?

p/S:我在 ubuntu 11.04 64 位中使用 eclipse CDT,而 ecl.o 是 32 位的,这就是为什么我必须将 -m32 放到 g++ 中。 p>

【问题讨论】:

  • 你在“ecl.h”中有ECL_bDrawrect的声明吗?它来自 C 吗?
  • 是的,这里是:void ECL_bDrawrect(int x, int y, int w, int h, int f);
  • WTH 是您的ecl.o 文件在/usr/include 中执行的操作???
  • @paxdiablo:我只是把它放在那里以确保它可以从 Eclipse 调用:D
  • 从新的编译日志中,您尝试在编译阶段进行链接,它只是吐出“未使用的链接器输入文件”,因为那时它没有链接。那么当您进入链接阶段时,您基本上只是将 Visual.o 重命名为 Visual,而无需在 ecl.o 中进行链接。尝试将 /usr/include/ecl.o 移动到链接阶段? (我对日食一无所知)。

标签: c++ linux ubuntu linker object-files


【解决方案1】:

链接器命令行中未列出 ecl.o 文件。

另外,您可能需要在 include 周围使用 extern "C"

extern "C" {
#include "ecl.h"
}

【讨论】:

  • 感谢您的快速回复。顺便说一句,我照你说的做了,但仍然出现上述错误。
【解决方案2】:

问题是否可能是 C++ 名称修改?也许将您的函数声明为 extern "C" 它会起作用。

#ifdef __cplusplus 
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif

【讨论】:

  • 我也在 ecl.h 文件的开头得到了这个:#ifndef __ECL #define __ECL #if defined(__cplusplus) extern "C" { #endif
  • ECL_bDrawrect(不是ECL_Drawrect)的声明在哪里。我认为你应该用extern "C" {} 括起来,而不是宏定义,而是实际的函数声明。
  • ECL_bDrawrect的声明应该在ecl.o中,问题是我想通过ecl.o文件来使用这个函数。
  • 我说的是原型。不是实际的函数定义。即,在某些标头中应该有一个像 void myfunc(); 这样的声明,而在某些源中应该有一个像 void myfunc() {doSomething();} 这样的定义
猜你喜欢
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多