本人在win10下安装了mingw环境,以方面windows下测试gcc编译器构建一些开源组件。可是windows系统下遇到了一些编译问题。linux
1. 问题现象windows
一次手写的Makefile遇到了以下编译错误:测试
1 $ make 2 g++ -I ../include -fPIC -c JpegDecoder.cpp -o JpegDecoder.o 3 g++ -o JpegDecoder JpegDecoder.o -L../libs -lcodec_utils 4 d:/ProgramFiles/mingw-w64/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lcodec_utils 5 collect2.exe: error: ld returned 1 exit status 6 make: *** [JpegDecoder] Error 1
但是,在linux平台上编译这段代码彻底没问题。。。见什么鬼了???spa
2. 错误缘由分析命令行
直接提示代表,欲生成JpegDecoder的可执行文件,须要连接动态库libcodec_utils.so,可是找不到这个这个库文件,所以出现了这个连接错误提示。3d
3. 编译知识回顾code
通常理论常识是:-L参数指定了库的目录,-lxyz参数指定库名。例如,本次连接的动态名称为libcodec_utils.so,该库位于上级目录的libs文件夹下。blog
4. 疑问编译器
我再次确认,库目录和库文件都存在,Makefile写的应该没问题!何况在Linux平台下编译经过了!但为何在win下仍是报错???it
5. 答案分析
因为使用的链接器ld.exe是运行在window系统下的,可能跟linxu平台下的使用方法稍有区别。
windows下查看命令行查看:ld --help,找到了一些连接参数信息:
其中,-l LIBNAME表示,要写成-l libcodec_utils.so形式,而不能作一些省略,例如去掉“lib”和“.so”。(真正验证时,还不是这种状况!!!)
在Linux平台下,显示同样的信息。多是linux平台下,将参数"-lcodec_utils"自动补全为"-l libcodec_utils.so"形式。
6. 验证结论
6.1 参数形式:"-L../libs -lcodec_utils"
6.2 参数形式:"-L../libs -l libcodec_utils.so"
注意,错误提示跟6.1的稍微有些区别,系统自动添加了前缀"-l"到库名前,变成了"-llibcodec_utils.so"库找不到。
6.3 参数形式:"-L../libs libcodec_utils.so"
这是在windows平台下惟一的正确的参数。