虽然我不熟悉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工作,我添加了gnelib
和NL
作为库,并更改为构建命令:
${COMMAND} ${INPUTS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${FLAGS}
答案 0 :(得分:2)
我不确定你为什么要使用函数点参数atexit
,但显然如果initGNE()
期望指向函数的指针传递不同的东西,它将无效。特别是,传递调用void
的{{1}}结果无效。
第一个示例中的错误只是编译程序而不是链接到相应的库:您需要指定定义函数的库。请查看,例如,installation tutorial,表明您需要使用atexit
。
答案 1 :(得分:1)
在尝试修复原始问题时,您已经遇到了其他问题,所以让我们关注原始错误。编译器已完成处理您的代码,但链接器未找到您使用的符号。您需要将包含这些符号的库链接到可执行文件中。