cbp2make在windows上链接库与“.a”

时间:2014-09-04 16:43:53

标签: windows makefile codeblocks mingw32

我正在尝试从codeblock项目文件生成一个makefile" .cbp"使用Windows上的cbp2make工具。但是生成的makefile有unix格式的归档库:

LIB = libkernerl32.a libuser32.a libgdi32.a

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

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

我在文本编辑器中查看了project.cbp并发现其下面有:  等...

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

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

如何让cbp2make拥有:  LIB = -lkernel32 -luser32 代替  LIB = libkernel32.a libuser32.a ?

1 个答案:

答案 0 :(得分:2)

生成链接参数行时,

cbp2makeCodeBlocks的行为略有不同。

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并没有很好地处理这个问题。