私は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}