我一直在训练在c ++中使用面向对象的编程,但我一直收到这个错误:
1>main.obj : error LNK2005: "int WIDTH" (?WIDTH@@3HA) already defined in GameObject.obj
1>main.obj : error LNK2005: "int HEIGHT" (?HEIGHT@@3HA) already defined in GameObject.obj
1>Spaceship.obj : error LNK2005: "int WIDTH" (?WIDTH@@3HA) already defined in GameObject.obj
1>Spaceship.obj : error LNK2005: "int HEIGHT" (?HEIGHT@@3HA) already defined in GameObject.obj
1>C:\Users\ted\documents\visual studio 2010\Projects\fullSpace\Debug\fullSpace.exe : fatal error LNK1169: one or more multiply defined symbols found
Run Code Online (Sandbox Code Playgroud)
但是对我来说,似乎整个代码都是正确编写的,并且只在Global标头中提到了两个int,并且所有对象似乎都是正确继承的.然而,正如我刚才所说,我是OOP的初学者,所以我真的需要一个意见:值得一提的是我正在使用allegro 5创造一个侧射手.
这是代码:
(主要):
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_font.h>
#include <allegro5\allegro_ttf.h>
#include <allegro5\allegro_audio.h>
#include <allegro5\allegro_acodec.h>
#include <list> …Run Code Online (Sandbox Code Playgroud) 我是从Allegro 5开始的,但很快我就陷入了第二个类似hello-world的程序中.经过一些调试后,我得出结论,程序在调用函数时崩溃了al_clear_to_color(ALLEGRO_COLOR).我已尝试静态和动态地链接allegro,但问题仍然存在.我完全迷失了.
这是代码:
#include <cstdio>
#include <allegro5/allegro.h>
int main() {
ALLEGRO_DISPLAY *display;
ALLEGRO_KEYBOARD_STATE kbState;
if(!al_init())
return 0;
if(!al_install_keyboard())
return 0;
display = al_create_display(800, 600);
if(!display)
return 0;
do {
al_get_keyboard_state(&kbState);
al_clear_to_color(al_map_rgb(255, 255, 255));
al_flip_display();
al_rest(0.5);
} while(!al_key_down(&kbState, ALLEGRO_KEY_ESCAPE));
al_destroy_display(display);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
替换线
al_clear_to_color(al_map_rgb(255, 255, 255));
Run Code Online (Sandbox Code Playgroud)
为线
al_clear_to_color(tempClearColor);
Run Code Online (Sandbox Code Playgroud)
声明
ALLEGRO_COLOR tempClearColor = al_map_rgb(255, 255, 255);
Run Code Online (Sandbox Code Playgroud)
在循环开始之前,它确实有效,但在函数崩溃时
al_destroy_display(display);
Run Code Online (Sandbox Code Playgroud)
叫做.
调试器返回消息:
读取C:\ Program Files(x86)\ CodeBlocks\MinGW\bin\libstdc ++ - 6.dll的共享库符号时出错:
编程接收信号SIGSEGV,分段错误.
昨天我决定下载,安装并尝试使用Allegro 5.我还下载了Code :: Blocks 12.11 w/MinGW编译器.我设置了所有内容并正确安装了所有内容(或者我认为)并尝试运行示例代码以查看它是否可行:
#include <stdio.h>
#include <allegro5/allegro.h>
int main(int argc, char **argv){
ALLEGRO_DISPLAY *display = NULL;
if(!al_init()) {
fprintf(stderr, "failed to initialize allegro!\n");
return -1;
}
display = al_create_display(640, 480);
if(!display) {
fprintf(stderr, "failed to create display!\n");
return -1;
}
al_clear_to_color(al_map_rgb(0,0,0));
al_flip_display();
al_rest(10.0);
al_destroy_display(display);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译并运行程序时,会出现一个错误消息框,指出"程序入口点_gxx_personality_v0无法位于动态链接库libstdc ++ - 6.dll中." 我在网上搜索了大约一个小时试图找到解决这个问题的方法,就像我对大多数事情一样,但我空手而归.我想知道是否有人对此问题的任何修复有任何想法,如果是这样,请尽快告诉我!提前致谢!
使用 Allegro 5,如何在全屏模式下初始化游戏,使其符合屏幕格式(宽屏 16:9 与普通 3:4)
al_create_display (w, h)
Run Code Online (Sandbox Code Playgroud)
让我们选择您想要的任何比例。例如,无论屏幕大小如何,您都可以设置 640x480。但在宽屏显示器上看起来会很奇怪。你怎么知道使用哪个比率?
在Allegro 5中编写游戏循环的最佳方法是什么,它始终以相同的速度运行,并且正确地将绘图逻辑与更新逻辑分开?我应该使用线程吗?我应该使用新的Allegro事件系统吗?
我不会开始讨论哪个库更好,它会违反规则,但更多的是提出一系列技术问题.当我问是否有特殊技术时,只需说出技术的名称或链接.
别忘了,我还要比较SDL 1.2和SDL 1.3,而不仅仅是其中之一
哪个库有多个窗口支持?我已经知道SDL的答案:SDL 1.2,不,但是是的
哪些库是多线程安全的?
大多数速度测试是在SDL和allegro使用软件加速时完成的,但现在SDL 1.3,allegro 5和sfml在速度方面使用硬件加速,它们如何比较?
哪个库可以同时检测多个键盘?有没有特殊的技术呢?
有没有办法将结果集成到GTK窗口中?如果是,是否有任何特殊技术?(我记得上次我使用SDL 1.2时,我无法做到这一点......)
哪个库支持3d?(使用openGL)
如果我将X库与OpenGL用于图形,是否会有限制,或者更多/更少的功能?(我的意思是,对于所有这些库,使用opengl的图形是否相同?)
我可以静态链接到哪些库?
最后,有些图书馆更倾向于特定的游戏风格吗?(像制作RPG时更喜欢使用X库,而制作策略游戏,基于游戏的游戏时更多使用Y库...)
不要忘记SDL 1.2和SDL 1.3
编辑:
我将尝试分享我发现的所有内容,从我的研究中,随时为我的问题提供更多答案.
多窗口:SDL 1.3,SFML无多窗口:SDL 1.2
多线程安全:Allegro 5,SFML
不是多线程安全:
速度:未知
不止一个按键支持:SFML,Allegro 5
我正在尝试用 allegro5 在 C 中播放 wav 文件,我写了下面的代码:
#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
int main(int argc, char **argv){
ALLEGRO_DISPLAY *display = NULL;
if (!al_init()){
fprintf(stderr, "failed to initialize allegro!\n");
return -1;
}
if (!al_install_audio()){
fprintf(stderr, "failed to initialize audio!\n");
return -1;
}
if (!al_init_acodec_addon()){
fprintf(stderr, "failed to initialize audio codecs!\n");
return -1;
}
if (!al_reserve_samples(1)){
fprintf(stderr, "failed to reserve samples!\n");
return -1;
}
al_install_audio();
al_init_acodec_addon();
ALLEGRO_SAMPLE *sample = al_load_sample("bomb.wav"); //sample always NULL
al_reserve_samples(1);
if (!sample){
printf("Audio clip sample …Run Code Online (Sandbox Code Playgroud) 我正在使用调试simbols编译一个程序,该程序链接到也使用调试符号编译的共享库(liballegro).当我尝试进入这个共享库的一个函数时,我看不到任何代码.
file myBin
mybin: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d4133ef127e81ffb007c4c17e10f4ddaefac6a0f, with debug_info, not stripped
file lib/liballegro-debug.so
liballegro-debug.so.5.2.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=dd75ca87e0ed86832ed02a1c40548a055ad4f551, with debug_info, not stripped
Run Code Online (Sandbox Code Playgroud)
GDB显示了如何使用调试信息加载此lib:
(gdb) info shared
From To Syms Read Shared Object Library
0x00007ffff7dd9b40 0x00007ffff7df5110 Yes (*) /lib64/ld-linux-x86-64.so.2
0x00007ffff7a5a0d0 0x00007ffff7b84591 Yes correct/path/to/liballegro-debug.so
0x00007ffff76ffd60 0x00007ffff7778eef Yes (*) /usr/lib/libm.so.6
0x00007ffff74e1640 0x00007ffff74eefb1 Yes (*) /usr/lib/libpthread.so.0
[...]
Run Code Online (Sandbox Code Playgroud)
所以我在一个函数调用中放了一个断点,它位于共享库中(al_load_bitmap):
90 level->tileset.parent = al_load_bitmap(filename); …Run Code Online (Sandbox Code Playgroud) 我正在调试在创建启用多重采样的 Allegro 5 Direct3D 窗口时窗口创建闪烁问题。我已将问题范围缩小到 allegro 的 d3d_disp.cpp 源文件中的窗口创建问题。但是,我无法从 DirectX 获得任何调试输出。闪烁仅发生在 D3D 模式(而非 OpenGL)下并且仅在启用多重采样时发生。另请注意,这只发生在 NVIDIA GPU 上运行程序时,而不是在我的集成 Intel 上运行程序时。
我运行的是 Windows 10。
我已尝试在 Visual Studio 2017 中对此进行调试,但它无法捕获 DX 的调试输出。我从 2010 年 6 月开始安装 DirectX SDK 时安装了 DirectX 调试符号。
我已经尝试重建 allegro 并链接到 gcc 中的 libd3dx9d.a,但我仍然无法进入 directx 函数调用,并且符号未加载。从 2010 年 6 月开始,MinGW-W64 GCC 8.1 或 DirectX SDK 中没有可用的 libd3d9d.a(注意 d 表示调试)库。
我尝试通过 PIX 运行我的程序,但它给了我一个无法解决的不兼容错误。
这是可测试的 allegro 5 示例代码:
#include <allegro5/allegro.h>
#include <allegro5/allegro_color.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_direct3d.h>
#include <cstdio>
#include <climits>
int main(int …Run Code Online (Sandbox Code Playgroud) 今天我为C安装了Allegro游戏编程库,我试图包含其中一个头文件但是当我尝试gcc -I./include example.c -o a.exe在终端中执行时,我不断收到此错误:
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
(maybe you meant: __al_mangled_main)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我使用以下说明安装了Allegro 5:https://wiki.allegro.cc/index.php?title = Install_Allegro5_From_GIT/OSX
example.c代码:
#include <stdio.h>
#include <allegro5/allegro.h>
int main(int argc, const char *argv[]){
puts(“Hello, world!”);
return 0;
}
Run Code Online (Sandbox Code Playgroud) allegro5 ×10
c ×6
c++ ×5
allegro ×2
debugging ×2
audio ×1
codeblocks ×1
directx-9 ×1
fullscreen ×1
game-loop ×1
gdb ×1
lldb ×1
mingw ×1
oop ×1
resolution ×1
sdl ×1
sfml ×1
widescreen ×1