GNE的几个错误

时间:2012-09-15 01:39:18

标签: c++ networking

虽然我不熟悉C ++,(我有Java经验)我正在开始一个需要使用GNE或游戏网络引擎的项目。

在他们的tutorial中,(从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工作,我添加了gnelibNL作为库,并更改为构建命令:

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

2 个答案:

答案 0 :(得分:2)

我不确定你为什么要使用函数点参数atexit,但显然如果initGNE()期望指向函数的指针传递不同的东西,它将无效。特别是,传递调用void的{​​{1}}结果无效。

第一个示例中的错误只是编译程序而不是链接到相应的库:您需要指定定义函数的库。请查看,例如,installation tutorial,表明您需要使用atexit

答案 1 :(得分:1)

在尝试修复原始问题时,您已经遇到了其他问题,所以让我们关注原始错误。编译器已完成处理您的代码,但链接器未找到您使用的符号。您需要将包含这些符号的库链接到可执行文件中。