搜索
bottom↓
回复: 19

【求助】Windows下用makefile编译报错问题

[复制链接]

出0入0汤圆

发表于 2020-4-15 09:24:31 | 显示全部楼层 |阅读模式
本帖最后由 sbusr 于 2020-4-15 10:57 编辑

从github上下了个源码的库,需要自己编译出lib和dll,或者linux的库so。
之前电脑上装过Qt,带有MinGW。还装过QP-bundle,也有MinGW。
按照说明文件,到指定目录,make,就报错,内容如下(Windows 10)
process_begin: CreateProcess(NULL, uname, ...) failed.
make: make/target_system.mk:1: pipe: No error
compiling linked_list.c
mkdir -p build/src/common/
命令语法不正确。
make: *** [Makefile:140: build/src/common/linked_list.o] Error 1

怀疑是Windows的问题,到Ubuntu 16.04虚拟机里,直接编译就过了。.a文件和.so文件直接就出来了。

又回到Windows,分析mkdir的错误,手敲命令,发现好像是路径分隔符的问题,用'/'这个斜杠不行,换成'\'就好了。
但是,咱又不能去改人家的makefile文件……

像这种开源的代码,应该很多人都用过的,像这种问题,应该是有办法解决的。
请各位指点一二。谢谢。

附件按钮点不上,图片按钮也点不了,添加代码按钮也点不了,只能上链接了。
修改,增加github链接,就几百kb。
https://github.com/mz-automation/lib60870

出30入54汤圆

发表于 2020-4-15 09:52:52 | 显示全部楼层
开源软件大部分不会考虑在windows下编译,老老实实用linux吧。即使大名鼎鼎的openssl,其在windows下的编译也很不友好(虽然修改一下也能编过)

出0入0汤圆

 楼主| 发表于 2020-4-15 09:57:38 | 显示全部楼层
cloudboy 发表于 2020-4-15 09:52
开源软件大部分不会考虑在windows下编译,老老实实用linux吧。即使大名鼎鼎的openssl,其在windows下的编译 ...


这个开源代码,一方面是我要在MCU上使用,另一方面,准备编译成dll给上位机使用,而上位机是LabVIEW在Windows上的……无奈啊

难道我要改makefile,把'/'换成'\',不要啊

出0入58汤圆

发表于 2020-4-15 10:26:31 | 显示全部楼层
sbusr 发表于 2020-4-15 09:57
这个开源代码,一方面是我要在MCU上使用,另一方面,准备编译成dll给上位机使用,而上位机是LabVIEW在Win ...

linux也可以编译出dll给windows用。得严格按照github上面的环境要求编译,人家用linux你就用linux。

出0入0汤圆

发表于 2020-4-15 10:36:40 | 显示全部楼层
装一个cygwin64,windows模拟linux环境的

出40入42汤圆

发表于 2020-4-15 10:50:19 | 显示全部楼层
Windows的shell命令跟Linux的有差异的,装个msys2模拟Linux环境用MinGW编译应该没问题的,或者用楼上说的cygwin

出0入0汤圆

 楼主| 发表于 2020-4-15 10:51:22 | 显示全部楼层
shawn_bu 发表于 2020-4-15 10:26
linux也可以编译出dll给windows用。得严格按照github上面的环境要求编译,人家用linux你就用linux。 ...

噢?是make时候加啥参数吗?
makefile文件里面有支持linux和windows的语句。文档中也说是支持windows, linux, darwin, bsd

出0入0汤圆

 楼主| 发表于 2020-4-15 10:53:05 | 显示全部楼层
本帖最后由 sbusr 于 2020-4-15 10:54 编辑
落叶知秋 发表于 2020-4-15 10:50
Windows的shell命令跟Linux的有差异的,装个msys2模拟Linux环境用MinGW编译应该没问题的,或者用楼上说的cy ...


但是我要编译出来在windows用的dll,可以交叉编译?

我有装好的ubuntu 16.04虚拟机

出40入42汤圆

发表于 2020-4-15 11:16:45 | 显示全部楼层
sbusr 发表于 2020-4-15 10:53
但是我要编译出来在windows用的dll,可以交叉编译?

我有装好的ubuntu 16.04虚拟机 ...

MinGW编译出来的就是DLL,听说Linux下也可以用MinGW

出0入442汤圆

发表于 2020-4-15 12:56:51 | 显示全部楼层
sbusr 发表于 2020-4-15 10:53
但是我要编译出来在windows用的dll,可以交叉编译?

我有装好的ubuntu 16.04虚拟机 ...

不可以。如果有cmake,试试用vs2015及以上生成sln然后在vs里面编译。

出0入0汤圆

发表于 2020-4-15 13:08:14 | 显示全部楼层
为啥不可以修改makefile呢?在windows下可以安装gnu环境的

出0入0汤圆

 楼主| 发表于 2020-4-15 14:07:52 | 显示全部楼层
本帖最后由 sbusr 于 2020-4-15 14:44 编辑
落叶知秋 发表于 2020-4-15 10:50
Windows的shell命令跟Linux的有差异的,装个msys2模拟Linux环境用MinGW编译应该没问题的,或者用楼上说的cy ...


刚装了msys2,在里面装了mingw的一堆包,到指定目录去用mingw32-make,当然make成功。
但是make出来的是linux的库.a文件,而不是windows的.dll文件啊。怎么办?

补充,build目录的名字是build_win32,看来是当作windows系统操作的,但是好奇怪。

再补充,分析了一下target_system.mk文件,应该是里面关于win32和win64的一些处理,导致没有编译出dll。
修改,上面一行,描述不对,不是win32和win64的问题,还在查。

出40入42汤圆

发表于 2020-4-15 14:48:10 | 显示全部楼层
sbusr 发表于 2020-4-15 14:07
刚装了msys2,在里面装了mingw的一堆包,到指定目录去用mingw32-make,当然make成功。
但是make出来的是l ...

看了一下Makefile文件,.a文件是固定会生成的,按道理会识别到Windows环境后,生成.dll文件的,有没有报错什么的?

出0入0汤圆

 楼主| 发表于 2020-4-15 15:18:14 | 显示全部楼层
落叶知秋 发表于 2020-4-15 14:48
看了一下Makefile文件,.a文件是固定会生成的,按道理会识别到Windows环境后,生成.dll文件的,有没有报 ...

没有报错。我参考139行的@echo在136行前面加了@echo,重新make,没有显示出来这个echo,说明应该没有执行这一段

出40入42汤圆

发表于 2020-4-15 17:47:28 | 显示全部楼层
sbusr 发表于 2020-4-15 15:18
没有报错。我参考139行的@echo在136行前面加了@echo,重新make,没有显示出来这个echo,说明应该没有执行 ...

无聊在电脑上试了一下,的确只会生成.a文件,看了Makefile文件,在all命令里面,没有把生成动态库的dynlib部分加进去,只有静态库的lib
然后加上试了一下,发现有另外一个库的依赖,libiec61850,看来楼主得捋一捋Makefile里的关系

出0入0汤圆

 楼主| 发表于 2020-4-15 22:44:55 | 显示全部楼层
落叶知秋 发表于 2020-4-15 17:47
无聊在电脑上试了一下,的确只会生成.a文件,看了Makefile文件,在all命令里面,没有把生成动态库的dynli ...

那我得看看all是咋回事了,没怎么用过makefile
还有,libiec1850是这个公司出的另一组库,但应该与这个无关吧,是独立的。。。

出0入0汤圆

发表于 2020-4-16 08:03:20 | 显示全部楼层
用git bash作为终端进行编译就好了

出0入0汤圆

 楼主| 发表于 2020-4-16 09:25:48 | 显示全部楼层
落叶知秋 发表于 2020-4-15 17:47
无聊在电脑上试了一下,的确只会生成.a文件,看了Makefile文件,在all命令里面,没有把生成动态库的dynli ...

DYNLIB_LDFLAGS=-Wl,-no-undefined -Wl,--enable-runtime-pseudo-reloc -Wl,--output-def,libiec61850.def,--out-implib,libiec61850.a
这后面两段,应该是指定输出的文件名吧,--output-def,libiec61850.def,--out-implib,libiec61850.a

出40入42汤圆

发表于 2020-4-16 10:55:00 | 显示全部楼层
sbusr 发表于 2020-4-16 09:25
DYNLIB_LDFLAGS=-Wl,-no-undefined -Wl,--enable-runtime-pseudo-reloc -Wl,--output-def,libiec61850.de ...

我的Makefile水平也是入门级别的
昨天试了一遍报错,看了以为要依赖libiec61850这个库,但看了你的回帖后,查了一下发现应该是作者的笔误,这个不影响
刚才试了一下,能够编出来DLL了
1.要在Makefile文件里面的all关键字后面添加 “dynlib”,即这样:all:        lib dynlib
2.要使用mingw32来编译,里面用到了32位的API
3.在Makefile文件里面的Windows部分的源文件目录添加一条(应该是作者漏了没更新):LIB_SOURCE_DIRS += src/hal/serial/win32
  即在19行开始那部分,不然编译会报错没有对应的function

至于DLL能不能用就不知道了哈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2020-4-16 11:36:32 | 显示全部楼层
本帖最后由 sbusr 于 2020-4-16 11:39 编辑
落叶知秋 发表于 2020-4-16 10:55
我的Makefile水平也是入门级别的
昨天试了一遍报错,看了以为要依赖libiec61850这个库,但看 ...


我还没到入门,刚看到门呢
那我也参考你的,把makefile改一下,再用Qt试着调用一下这个库看看。
PS:昨天用的是msys 64bit,今天换到msys 32bit,刚装完mingw相关的工具。
谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 02:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表