本人在win10下安装了mingw环境,以方面windows下测试gcc编译器构建一些开源组件。但是windows系统下遇到了一些编译问题。

1. 问题现象

  一次手写的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平台上编译这段代码完全没问题。。。见什么鬼了???

2. 错误原因分析

  直接提示表明,欲生成JpegDecoder的可执行文件,需要链接动态库libcodec_utils.so,但是找不到这个这个库文件,因此出现了这个链接错误提示。

3. 编译知识回顾

  一般理论常识是:-L参数指定了库的目录,-lxyz参数指定库名。例如,本次链接的动态名称为libcodec_utils.so,该库位于上级目录的libs文件夹下。

4. 疑问

  我再次确认,库目录和库文件都存在,Makefile写的应该没问题!况且在Linux平台下编译通过了!但为什么在win下还是报错???

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平台下唯一的正确的参数。

mingw32环境下链接库找不到问题的更多相关文章

  1. Python3.5在Windows7环境下Scrapy库的安装

    Python3.5在Windows7环境下Scrapy库的安装 忙活了一下午,总算是把Scrapy库给装完了,记下来给需要帮助的人 首先安装的环境:Windows7 64位 Python的版本是:3. ...

  2. Anaconda环境下安装库

    使用anaconda环境下使用pycharm后,有些其他库也想安装,但开始在python.exe目录下安装没成功,因为pycharm用的环境已经不是原始的python.exe解释器了.就总结了一些安装 ...

  3. VS2013环境下Boost库配置

    序言 最近了解各大互联网公司的校招要求,发现了解Boost程序库也是不可或缺的一部分~ 于是,决定潜心研究下,这个准标准库~ 首先,在官网下载boost的最新版本Boost 1.59.0,这是当前的最 ...

  4. 解决thinkphp在开发环境下文件模块找不到的问题

    win10系统下,phpstudy开发环境下小问题描述: 找不到public公共模块. Not Found The requested URL /public/admin/login.html was ...

  5. AIX 环境下ODM库同步

    IBM AIX v5.3操作系统环境下有时会出现ODM库与rootvg硬盘上数据不同步的情况.使用命令lsvg -l datavg检查文件系统类型,发现显示为"???"这就表示OD ...

  6. Linux环境下stl库使用(vector)

    step1: #include <iostream> #include <vector> #include <string> using namespace std ...

  7. Linux环境下stl库使用(map)

    例子1: testMap.cpp #include <string.h> #include <iostream> #include <map> #include & ...

  8. Linux环境下c语言静态链接库和动态链接库创建和使用

    库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...

  9. Linux环境下的编译,链接与库的使用

    参考博客: http://www.cnblogs.com/qytan36/archive/2010/05/25/1743955.html http://m.blog.csdn.net/article/ ...

随机推荐

  1. Oracle缓存表与Oracle缓存的区别

    一.Oracle缓存表 与 Oracle缓存 的概念 Oracle 缓存:是把Oracle近期查询的语句放置在Oracle设定的缓存当中. Oracle 缓存表:是把某个表放置在缓存当中,缓存是Ora ...

  2. shell-变量输入内置read命令详解

    1. shell变量的输入 shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入得. [语法格式] read [参数] [变量名] [常用参数] -p:指定读取值时的提示符: ...

  3. 19。删除链表倒数第N个节点

    class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next# 这道题还是很简单的,我们只 ...

  4. spring cloud:搭建基于consul的服务提供者集群(spring cloud hoxton sr8 / spring boot 2.3.4)

    一,搭建基于consul的服务提供者集群 1,consul集群,共3个实例: 2, 服务提供者集群:共2个实例: 3,服务消费者:一个实例即可 4,consul集群的搭建,请参考: https://w ...

  5. spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)

    一,为什么要使用async异步线程池? 1,在生产环境中,有一些需要延时处理的业务场景: 例如:发送电子邮件, 给手机发短信验证码 大数据量的查询统计 远程抓取数据等 这些场景占用时间较长,而用户又没 ...

  6. docker19.03制作一个基于centos8的带有nfs4服务的镜像

    一,下载centos的image 1,下载centos最新image [root@localhost ~]# docker pull centos 2,查看是否成功下载到本地image [root@l ...

  7. printStackTrace()造成的并发瓶颈

    一 背景 在一次活动前的压测中,发现一个服务(平响为250ms左右)存在并发瓶颈,单实例的QPS压力从20升高到40后服务就雪崩了(平响急剧升高). 通过<jstack -F>命令查看线程 ...

  8. cookie和session可以参考的文章

    cookie和session可以参考的文章 cookie:http://www.lemfix.com/topics/5session:https://www.cnblogs.com/nickjiang ...

  9. Android 限制控件多次点击

    有时候多次点击页面会连续弹出多个页面,这时候写一个方法控制一下就OK.  private static long lastClickTime; public synchronized static b ...

  10. 建议你吃透python这68个内置函数!

    内置函数就是Python给你提供的, 拿来直接用的函数,比如print,input等. 截止到python版本3.6.2 ,一共提供了68个内置函数,具体如下 abs() dict() help() ...