2011-09-13 49 views
2

C++文件/項目,我有在Linux .o文件將如下的問題:鏈接的.o(C目標文件),在Linux上

我有Visual.cpp其調用函數ECL_Drawrect()這個函數定義爲:

#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路徑也incluced在我的項目,當我編譯我得到這個錯誤:

**** 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 ++。

+0

您是否在「ecl.h」中聲明瞭ECL_bDrawrect?它來自C嗎? –

+0

yes,it here: void ECL_bDrawrect(int x,int y,int w,int h,int f); – cppuser

+0

WTH是你在'/ usr/include'中的'ecl.o'文件嗎? – paxdiablo

回答

5

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

此外,你可能需要使用extern "C"各地包括:

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

感謝您的快速回復。順便說一句,我照你說的做,但仍然得到上述錯誤。 – cppuser

+0

啊,我4分鐘遲到:) – cyco130

0

是否有可能,這個問題是C++的名字改編?也許將你的函數聲明爲extern「C」它將起作用。

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

我也在ecl.h文件的開頭得到這個:的#ifndef __ECL 的#define __ECL #如果定義(__ CPLUSPLUS) 的extern 「C」{ #ENDIF – cppuser

+0

「ECL_bDrawrect」(不是'ECL_Drawrect')的聲明在哪裏?我想你應該用'extern「C」{}'把它括起來,而不是宏定義,而是實際的函數聲明。 – cyco130

+0

ECL_bDrawrect的聲明應該在ecl.o中,問題是我想通過使用ecl.o文件來使用這個函數。 – cppuser