2014-09-04 32 views
0

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

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退房手续的makefile -windows

我怎样才能得到cbp2make有: LIB = -lkernel32 -luser32 而不是 LIB = libkernel32.a libuser32。 a ?

+0

你真的有什么问题?如果将'LIB'行用作构建/打包/ etc等库文件列表,那么'LIB'行是完全合理的。 (假设它们实际存在,并且在Windows上具有这些名称)。链接器的'-l'参数是库的基本名称(即没有'lib'前缀且没有文件扩展名)。因此'-lkernel32'可以使用'libkernel32.so'或'libkernel32.a'(也可能是Windows上的libkernel32.dll),我不确定)。 – 2014-09-04 17:10:32

+0

问题是,“.a”在Windows上不存在,如果我没有弄错,它们通常是“.lib”,所以当我“制造”时它会失败,因为“libkernel32.a”根本不存在于Windows机器,它应该最好是寻找一个“.lib”。我想让cb2make工具用-lkernel32生成makefile,而不是libkernel32.a – 2014-09-04 17:18:21

+0

我的观点是,该行可能不是(尽管它可能)指定链接器的'-l'参数。你可以在链接器中使用一个裸文件名,但很多时候你都不会那样做。我并不是说Windows对Windows没有问题,它可能是非常好的,我只是不确定这是你遇到的实际问题(因为你实际上没有告诉我们这个问题是什么)。 – 2014-09-04 17:20:03

回答

2

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

CodeBlocks将自动添加-llink_library_switch),除去liblibrary_prefix)前缀和用于与(至少)a延伸列出静态链接库中移除的额外(设法仅测试情况)。对于动态链接库,so的扩展名不会被删除。

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

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

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

  • 不要前缀库名与lib即使用pthread代替libpthread
  • 待办事项不使用扩展名后缀库名称,即使用pthread而不是pthread.so,
  • 扩展名是否是已知的库扩展类型无关紧要。如果您有一个名为libfoo.bar.baz.so的库,则需要手动更正Makefile,或者手动更正
  • (可选):不要提供库的完整(相对)路径。

同时请注意link_library_switchlibrary_prefix是编译器/连接/平台相关。请参阅cbp2make配置文件以获取更多信息(cbp2make.cfg)。

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