Windows cbp2make使用“链接库”;。a「;在窗户上

Windows cbp2make使用“链接库”;。a「;在窗户上,windows,makefile,codeblocks,mingw32,Windows,Makefile,Codeblocks,Mingw32,我正在尝试使用windows上的cbp2make工具从代码块项目文件“.cbp”生成一个makefile。但生成的makefile具有unix格式的存档库: LIB=libkerner32.a libuser32.a libgdi32.a ,这会在尝试使用mingw32-make.exe时引发问题,它会抱怨libkerner32.a丢失 当我通过代码块编译时,我在构建日志中看到它使用了-Lkernel32 luser32-lgdi32 我在文本编辑器中查看了project.cbp,注意到下面有:

我正在尝试使用windows上的cbp2make工具从代码块项目文件“.cbp”生成一个makefile。但生成的makefile具有unix格式的存档库:

LIB=libkerner32.a libuser32.a libgdi32.a

,这会在尝试使用mingw32-make.exe时引发问题,它会抱怨libkerner32.a丢失

当我通过代码块编译时,我在构建日志中看到它使用了-Lkernel32 luser32-lgdi32

我在文本编辑器中查看了project.cbp,注意到下面有: 等等

因此,我假设代码块在构建时会将libkernel32.a中的代码块更改为-lkernel32,而cbp2make在生成makefile时似乎不会这样做

我运行:cbp2make.exe-in project.cbp-out makefile-windows

如何让cbp2make拥有: LIB=-lkernel32-luser32 而不是 LIB=libkernel32.a libuser32.a
当生成链接参数行时,cbp2make的行为与
代码块的行为有所不同

代码块
将自动添加
-l
链接库开关
),删除
库前缀
)前缀,并删除带有(至少)扩展名
的静态链接库的扩展名(仅测试该情况)。对于动态链接库,
的扩展将不会被删除

cb2make
另一方面也不是那么聪明。它不会自动删除
lib
前缀或扩展名(至少在
rev 147
)。然而,它在(
cbproject.cpp:790
)下面做的是检查库是否指定了扩展名

如果存在扩展,它将简单地复制粘贴库条目,保留其路径(如果给定)另一方面,如果扩展名不存在,则假定用户没有给出lib的完整路径,而是希望链接器搜索它。它将用
-l
作为库名称的前缀,但不会自动删除
lib
前缀(至少对于
g++
而言,这并不重要)

因此,为了确保
代码块
cbp2make
能够以类似的方式链接,我建议:

  • 不要在库名称前面加上
    lib
    ,即使用
    pthread
    而不是
    libpthread
  • 不要在库名称后面加扩展名,即使用
    pthread
    而不是
    pthread.so
  • 扩展是否为已知的库扩展类型并不重要。如果您有一个名为
    libfoo.bar.baz.so的库
    ,那么您就必须手动更正
    Makefile
  • (可选):不提供库的完整(相对)路径
另请注意:
链接库开关和
库前缀取决于编译器/链接器/平台。有关更多信息,请参阅
cbp2make
配置文件(
cbp2make.cfg


一般来说,
cbp2make
虽然在配置文件和内部数据结构中有所有特定于平台/编译器的详细信息,但处理得并不好。

您实际遇到了什么问题?如果将
LIB
行用作构建/打包/等的库文件列表(假设它们在Windows上实际存在,并且具有这些名称),则该行是完全合理的。链接器的
-l
参数是库基名称(即不带
lib
前缀且不带文件扩展名)。所以
-lkernel32
可以使用
libkernel32.So
libkernel32.a
(我不确定Windows上可能有
libkernel32.dll
),问题是“.a”在Windows上不存在,它们通常是“.lib”如果我没弄错的话,那么当我“确定”它失败是因为“libkernel32.a”windows计算机上根本不存在,它最多只能寻找一个“.lib”。我希望cb2make工具使用-lkernel32而不是libkernel32生成makefile。重点是,该行可能没有(尽管可能)为链接器指定
-l
参数。您可以在链接器中使用裸文件名,但很多时候您不会这样做。我并不是说这一行对于Windows来说没有错,很可能是这样,我只是不确定这是否是您遇到的实际问题(因为您实际上没有告诉我们该问题是什么)。哦,对不起,不,问题不在于指定文件名。我想它可能是“kernel32.lib”,编译起来不会有问题。但是,由于我希望makefile在windows而不是linux上工作,因此cbp2make不应该生成带有“.a”库扩展名的makefile,而应该生成“.lib”。这是生成makefile的一个问题。您没有抓住要点。你一直告诉我们你想要这个,但你没有告诉我们文件名“错误”的原因是什么。你暗示它正在破坏东西,但没有给我们错误信息或任何东西。这就是我一直想知道的。。。当您尝试使用它们进行构建时,什么(使用带有
.a
的makefile)被破坏了?