我正在尝试从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 ?
答案 0 :(得分:2)
cbp2make
与CodeBlocks
的行为略有不同。
CodeBlocks
会自动添加-l
(link_library_switch
),删除lib
(library_prefix
)前缀并删除列出的静态链接库的扩展名(至少)a
扩展(设法仅测试该情况)。对于动态链接库,so
的扩展名不会被删除。
cb2make
并不那么聪明。它不会自动删除lib
前缀和扩展名(至少rev 147
)。但是它在下面(cbproject.cpp:790
)执行的操作是检查是否使用扩展名指定了库。
如果存在扩展,它只会复制粘贴库条目,保留它的路径(如果给定)。 如果,另一方面扩展名不存在,则会假定用户没有提供lib的完整路径,而是希望链接器能够搜索为了它。它会在库名称前加上-l
,但不会自动删除lib
前缀(至少对g++
无关紧要)。
因此,为了确保CodeBlocks
和cbp2make
能够以类似的方式进行链接,我建议:
lib
为库名添加前缀,即使用pthread
代替libpthread
,pthread
代替pthread.so
,libfoo.bar.baz.so
的图书馆,你已经搞砸了,必须手动纠正Makefile
, 另请注意:link_library_switch
和library_prefix
依赖于编译器/链接器/平台。有关详细信息,请参阅cbp2make
配置文件(cbp2make.cfg
)。
一般来说,尽管在配置文件和内部数据结构中包含了所有平台/编译器特定的详细信息,但cbp2make
并没有很好地处理这个问题。