【发布时间】: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