为什么我的MSYS2 / MinGW64安装程序链接没有-l指令的SDL2,却没有链接SDL2_ttf?

时间:2019-01-08 12:03:39

标签: codeblocks sdl-2 mingw-w64 msys2

我安装了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获得自动链接魔术?

1 个答案:

答案 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或库时。在这种情况下,我是这三个人的新手。