编译makefile出现链接-ldl及多线程pthread库的问题

/////////对于linux我持中立态度,而且我认为linux这么多年发展比较慢的原因是因为桌面化做的不好或者不够好,所以我比较偏爱ubuntu。

由于以前项目是makefile的,我个人不是很喜欢makefile,因为他看起来比较费劲,而且编译完成后出现问题调试是个大难题,不是每个人都精通gdb,而且vi上手比较难。所以将工程转为codeblocks的cbp,本来想使用cmake的,但是觉得要写的比较多,于是作罢,毕竟代码不是跨平台的,windows下没法用。

编译完link的时候,报了一句undefinedreference’dlclose@xxx函数‘,不知道什么问题了,找主程过来看了下,说是dl库没有包进去,查了下dl库是用来做动态库加载的(dynamic load),项目用到了libmysqld.so,加了之后还是有问题,将-ldl链接选项改到最后才可以。

总结了下这些比较常见的undefined reference问题:

1.dl库

undefined reference to ‘dlerror’

undefined reference to ‘dlopen’

undefined reference to ‘dlerror’

增加-ldl链接选项 (-l是链接选项的前缀)

2.pthread库

undefined reference to ‘pthread_create’

undefined reference to ‘pthread_xxxx‘

增加-lpthread链接选项

3.rt库

undefined reference to `clock_gettime’

增加-lrt链接选项

如果是使用codeblocks,可以再link option里加,不过因为依赖顺序的问题,如果link option里加了还是报错,直接在link file里添加pthread dl rt等即可

如果是你自己的库出现这undefined reference什么函数,先去查下库的源代码,看看具体问题。


二///

进入到/openwrt/openwrt-dreambox/package/swconfig文件夹下面,在Makefile的40行 LIBS选项中添加 -ldl即可。

define Build/Compile

CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \

$(MAKE) -C $(PKG_BUILD_DIR) \

$(TARGET_CONFIGURE_OPTS) \

LIBS="$(TARGET_LDFLAGS) -lnl-tiny -lm-ldl-luci "

endef


三//修改方式很简单。。。其实这些文件都有,只需要在配置文件内添加上就可以了。

添加方式:

找到openwrt交叉编译环境,然后

cd staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/pkginfo/

对libc.provides进行修改,在最后添加这两个文件名称,如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 说明本次redis集群安装在rhel6.8 64位机器上,redis版本为3.2.8,redis的gem文件版本为...
    读或写阅读 15,387评论 3 9
  • 动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过...
    小5筒阅读 10,864评论 0 3
  • 首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Obje...
    一木之夏阅读 8,385评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,293评论 19 139
  • 洪夫人没有见到柳郁,一路闷闷不乐的回了家。 刚走进客厅,却意外看到丈夫洪晟真坐在沙发上,喝着茶,吸着烟,很悠闲的样...
    子敬wu阅读 1,157评论 0 1