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"また、おそらくインクルードの周りで使用する必要があります:

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 に答える