2

我在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++ 中。

4

2 回答 2

5

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

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

extern "C" {
#include "ecl.h"
}
于 2011-09-13T09:49:06.213 回答
0

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

#ifdef __cplusplus 
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif
于 2011-09-13T09:53:08.913 回答