1

私はC++を初めて使用しますが、(Javaの経験があります)GNEまたはゲームネットワークエンジンの使用を必要とするプロジェクトを開始しています。

彼らのチュートリアルでは(2003年から付与されています)、次の行を使用しています。

if ( initGNE( NL_IP, atexit ) ) {

私のコードでは、次を使用します。

log("Initializing GNE...");

if(initGNE(NL_IP, atexit)) {
    err("GNE failed to initialize!");
    err("Press ENTER to close MoServ...");
    std::cin.get();
    exit(0);
}

log("-> Registering game version...");
setGameInformation(myName(), myVer());
log("-> Initializing console...");
initConsole(false);
setTitle("MoServ");

log("GNE initialized!");

コンパイル中に(Linuxでg ++を使用し、eclipse / w CDTを介して)、次のエラーが発生します。

/home/tehtros/Dev/MoServ/Debug/../src/main.cpp:38: undefined reference to `GNE::initGNE(unsigned int, int (*)(void (*)()), int)'
/home/tehtros/Dev/MoServ/Debug/../src/main.cpp:46: undefined reference to `GNE::setGameInformation(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)'
/home/tehtros/Dev/MoServ/Debug/../src/main.cpp:48: undefined reference to `GNE::Console::initConsole(bool)'
/home/tehtros/Dev/MoServ/Debug/../src/main.cpp:49: undefined reference to `GNE::Console::setTitle(char const*)'

注:ドキュメントでは、最初にGNE :: initGNE()を呼び出さない限り、他のすべてのGNE関数で「未定義の参照」エラーが発生すると述べています。


私が変更した場合:

if(initGNE(NL_IP, atexit)) {

に:

if(initGNE(NL_IP, atexit())) {

次に、エラーが発生します。

../src/main.cpp:38:27: error: too few arguments to function ‘int atexit(void (*)())’

これはドキュメントのどこにもありませんが、これを変更すると、次のようになります。

if(initGNE(NL_IP, atexit())) {

さらに、これに:

if(initGNE(NL_IP, atexit(shutdownGNE()))) {

次に、このエラーが発生します:

../src/main.cpp:38:40: error: invalid use of void expression

次のように括弧を削除すると、次のようになります。

if(initGNE(NL_IP, atexit(shutdownGNE))) {

次に、このエラーが発生します:

../src/main.cpp:38:39: error: invalid conversion from ‘int’ to ‘int (*)(void (*)())’ [-fpermissive]
/usr/local/include/gnelib/ObjectBrokerClient.h:120:15: error:   initializing argument 2 of ‘bool GNE::initGNE(NLenum, int (*)(void (*)()), int)’ [-fpermissive]

ご覧のとおり、私は少し迷っています。GNEが壊れているのか、ちょっとしたミスをしているだけなのか、何をしているのかまったくわからないのかわからないので、あまり理解せずに大きなプログラムを作成するのはやめるべきです。(それから、私は実際に行うことによって学びます。方法を読むことによってではありません。)誰かが助けやサポートを提供し、私が間違っていることを明確にすることができますか?


編集:私は彼らの例を変更せずに彼らのウェブサイトから直接コピーして貼り付けました、そしてそれはコンパイルされませんでした。


解決策:コマンドの順序を変更することで、この問題を解決しました。コマンドラインでは、次のようにコンパイルできました。

g++ -o test "test.cpp" -lgnelib -lNL

これをEclipseで機能させるために、ライブラリとしてgnelibとを追加し、ビルドコマンドを次のように変更しました。NL

${COMMAND} ${INPUTS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${FLAGS}
4

2 に答える 2

2

関数ポイント引数で遊んでいる理由はわかりませんが、関数へのポインターが代わりに何か別のものを渡すと予想されるatexit場合、明らかに機能しません。特に、を呼び出しinitGNE()た結果を渡すことはできません。voidatexit

最初の例のエラーは、プログラムをコンパイルしただけで、適切なライブラリとリンクしていないことが原因です。関数が定義されているライブラリを指定する必要があります。たとえば、を使用する必要があることを示すインストール チュートリアル-lgnelibをご覧ください。

于 2012-09-15T02:18:40.833 に答える
1

元の問題を修正しようとしている間に、他の問題が発生したため、元のエラーに焦点を当てましょう。コンパイラはコードの処理を完了しましたが、リンカーは使用しているシンボルを見つけていません。これらのシンボルを含むライブラリを実行可能ファイルにリンクする必要があります。

于 2012-09-15T02:13:33.287 に答える