0

function.cpp -> function.o にコンパイルされ、次に libFunction.so にコンパイルされます

#define PASTEHELPER(a,b) a ## b

#define PASTE(a,b) PASTEHELPER(a,b)

void PASTE(My,Function)() { .... }

main.cpp -> main.o にコンパイルされます。しかし、リンク時にエラー

void MyFunction();

g++ のリンク エラー。(ただし、Visual Studio では成功)

g++ -mtune=i686 -MP -MMD -MT .o -Wextra -Woverloaded-virtual -Wno-sign-compare -Wno-conversion -Wno-missing-field-initializers -O3 -DNDEBUG -fno-strict-aliasing -fPIC -fdiagnostics-show-option -DPROJECT=MyProjec  -o /mypath  main.o -L..  -L/sbcimp/run/pd/gcc/32-bit/4.4.2/lib/gcc/i686-pc-linux-gnu/4.4.2 -L/sbcimp/run/pd/gcc/32-bit/4.4.2/lib -lFunction -pthread -L/sbcimp/run/pd/python/2.7.1/lib -lpython2.7 -l util  -L/sbcimp/run/pd/boost/32-bit/1.47.0_gcc4.4.2/lib -lboost_filesystem -lboost_thread -lboost_regex -lboost_system -Wl,-rpath,/sbcimp/run/pd/boost/32-bit/1.47.0_gcc4.4.2/lib -L/sbcimp/run/pd/apache_xerces-c/32-bit/3.1.1_mt_gcc4.4.2/lib -lxerces-c -Wl,-rpath,/sbcimp/run/pd/apache_xerces-c/32-bit/3.1.1_mt_gcc4.4.2/lib -ldl -Wl,-z,origin -Wl,-rpath,'$ORIGIN' -Wl,-rpath,/sbcimp/run/pd/gcc/32-bit/4.4.2/lib/gcc/i686-pc-linux-gnu/4.4.2,-rpath,/sbcimp/run/pd/gcc/32-bit/4.4.2/lib,-soname,MyProject


main.cpp: undefined reference to 'MyFunction'. 

関数は、どの .h ファイルでも定義されていません。これが問題ですか?.h で関数を宣言する必要がある場合、どのように記述しますか?

4

1 に答える 1

0

貼り付けたリンカー エラーが完全かどうかわかりません。

とにかく、リンカが本当に文句を言うなら、MyFunctionそれはシンボルMyFunctionが C++ ではなく C であることを期待します (C++ では について文句を言うべきですMyFunction())。

void MyFunction();したがって、 asを宣言しているか、実際にはの代わりにを使用してコンパイルするextern "C"ことで得られていると思います。main.omain.cgccmain.cpp

次のコマンドを実行して、ライブラリにあるものとリンカーが期待するものを確認できます。

objdump -t function.o |grep MyFunction
objdump -t main.o |grep MyFunction

.cpp ファイルから両方の .o ファイルをコンパイルした場合、.o のようなシンボル名が得られるはずです_Z10MyFunctionv。シンボル名は両方で同じにする必要があります。しかし、そのうちの 1 つがマングルされていない場合 (つまり、ただの場合MyFunction)、それは C++ ではなく C からのものです。

両方がマングルされているが異なる場合は、両方のケースで関数を異なる方法で宣言しています。

の使用は#define、リンカーにまったく影響を与えるべきではありません。

于 2012-08-02T04:42:35.997 に答える