【问题标题】:cbp2make linking libraries with ".a" on windowscbp2make 在 Windows 上使用“.a”链接库
【发布时间】:2014-09-04 16:43:52
【问题描述】:

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

LIB = libkernerl32.a libuser32.a libgdi32.a

,在尝试使用mingw32-make.exe时导致问题,它抱怨libkernerl32.a丢失

当我通过代码块编译时,我在构建日志中看到它使用 -lkernerl32 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 ?

【问题讨论】:

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

标签: windows makefile codeblocks mingw32


【解决方案1】:

cbp2make 在生成链接参数行时与CodeBlocks 的行为有些不同。

CodeBlocks 将自动添加 -l (link_library_switch),删除 lib (library_prefix) 前缀并删除以(至少)a 扩展名列出的静态链接库的扩展名(仅用于测试这种情况)。对于动态链接库,so 的扩展名不会被删除。

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

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

因此,为了确保 CodeBlockscbp2make 能够以类似的方式进行链接,我建议:

  • 不要在库名称前加上lib,即使用pthread而不是libpthread
  • 不要在库名称后加扩展名,即使用pthread 而不是pthread.so
  • 扩展是否是已知的库扩展类型并不重要。如果你有一个名为 libfoo.bar.baz.so 的库,你就完蛋了,必须手动更正 Makefile
  • 可选:不要提供库的完整(相对)路径。

另请注意link_library_switchlibrary_prefix 取决于编译器/链接器/平台。更多信息请参考cbp2make配置文件(cbp2make.cfg)。

一般来说,cbp2make 并不能很好地处理这个问题,尽管在配置文件和内部数据结构中有所有平台/编译器特定的详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多