我安装了MSYS2和MinGW64。我还安装了Code :: Blocks,并指出它的工具链配置指向MinGW64 bin中的可执行文件。为了保持环境整洁,我只使用MinGW64 shell中的pacman安装了库。
$ pacman -Sl | grep SDL2
mingw32 mingw-w64-i686-SDL2 2.0.9-1
mingw32 mingw-w64-i686-SDL2_gfx 1.0.4-1
mingw32 mingw-w64-i686-SDL2_image 2.0.4-1
mingw32 mingw-w64-i686-SDL2_mixer 2.0.4-1
mingw32 mingw-w64-i686-SDL2_net 2.0.1-1
mingw32 mingw-w64-i686-SDL2_ttf 2.0.14-1
mingw64 mingw-w64-x86_64-SDL2 2.0.9-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_gfx 1.0.4-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_image 2.0.4-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_mixer 2.0.4-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_net 2.0.1-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_ttf 2.0.14-1 [installed]
使用Code :: Blocks,我可以编译并链接一个示例,该示例初始化SDL2,打开窗口并在SDL_Quit事件上退出。该示例项目没有其他编译器或链接器配置。实际上,Code :: Blocks全局设置也不会配置搜索目录。我想GCC的默认环境中已经设置了INCLUDE和LIB。
当我尝试使用SDL2_ttf时出现问题。我可以包含它,并且Code :: Blocks可以很好地提供一些代码完成功能。但是构建失败于“对TTF_Init的未定义引用”。
-------------- Build: Debug in TV Tennis (compiler: GNU GCC Compiler)---------------
g++.exe -LD:\msys64\mingw64\lib -o "bin\Debug\TV Tennis.exe" obj\Debug\main.o -lmingw32 -lSDL2main -lSDL2.dll -luser32 -lgdi32 -lwinmm -ldxguid
obj\Debug\main.o: In function `SDL_main':
H:/Datacenter/Source/TVTennis/C++/TV Tennis/main.cpp:45: undefined reference to `TTF_Init'
H:/Datacenter/Source/TVTennis/C++/TV Tennis/main.cpp:59: undefined reference to `TTF_OpenFont'
H:/Datacenter/Source/TVTennis/C++/TV Tennis/main.cpp:109: undefined reference to `TTF_CloseFont'
H:/Datacenter/Source/TVTennis/C++/TV Tennis/main.cpp:110: undefined reference to `TTF_Quit'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
5 error(s), 0 warning(s) (0 minute(s), 0 second(s))
如果我在项目的链接器选项中添加“ -lSDL2_ttf”,则问题就消失了。
我的问题是,为什么我会为SDL2而不是SDL2_ttf获得自动链接魔术?
答案 0 :(得分:0)
我发现在没有任何可见配置或显式指令的情况下,如何“神奇地”链接了SDL2。
当我创建Code :: Blocks项目时,我将其指定为SDL2项目。然后,默认情况下,Code :: Blocks通过项目的* .cbp文件(Code :: Blocks Project)将一堆库添加到项目中。
public class VisionCameras
{
private static ILog _logger;
private static ILog Logger
{
get
{
return _logger
?? (_logger = LogManager.GetLogger(typeof(VisionCameras)));
}
}
public IList<bdm.VisionCamera> vCams = new List<bdm.VisionCamera>();
public VisionCameras(int MachineID)
{
try
{
bdm.Machine Machine = DBHandler.Session().Get<bdm.Machine>(MachineID);
IList<BackupDataMiner.Domain.Backup> backups = Machine.Backups.OrderByDescending<BackupDataMiner.Domain.Backup, DateTime>
(x => x.BackupDate).ToList<BackupDataMiner.Domain.Backup>();
bdm.Backup backup = backups.First(x => x.ArchiveName.StartsWith("InVision"));
vCams = backup.VisionCamera;
}
catch (Exception e)
{
Logger.Debug(e.Message);
}
Logger.Debug("number of Vision cameras: " + vCams.Count);
}
}
}
老实说,这就是为什么我讨厌从项目模板开始;特别是当我不熟悉某种语言,IDE或库时。在这种情况下,我是这三个人的新手。