一次undefined reference to ***的编译错误记录

马谦马谦马谦 2018年10月8日18:50:15 2
文章最后编辑于:2018-10-18 18:52:15

一、问题描述

在编译C++程序时,遇到以下问题:

看到错误的第一直觉是共享库出问题了,因为以前出现这个问题都是因为库没有加进来,但是反复确认过后发现共享库并没有问题。

第一:编译的时候使用-l选项包含了库文件,并且库里面的函数也存在。

第二:库确实存在,不然也不会报上面的错误了,报的错误应该是:

试了各种方法都无效,百思不得其解,最后无意间发现竟然是c和c++符号表不兼容导致的。因为库是c编译的,程序是c++编译的,c和c++的符号表规则不一致,导致编译时找不到符号,因此编译报错。

二、重现

准备一个库libadd.so和一个源文件main.cpp

add.hadd.c的内容:

编译libadd.so能够正常编译,然后编译main:

此时编译就报错:

解决方案

在add.h中使用宏定义把函数声明为c导出的函数:

再编译就能通过了。

本文共执行45次查询,耗时0.579秒!
马谦马谦马谦

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:2   其中:访客  2   博主  0

    • avatar I have a dream 0

      您好,我在编译的时候也遇到一个undefined refenence的问题,并且是99个错误。。。看到您尝试各种方法最后找到问题所在,一定是非常好的体验!我现在研二(本科电气),现在做开发相关,说实话进步缓慢,希望可以请教您。下面的描述如果有时间,那就麻烦您帮我看一下。我的问题是这样的,先说几个关键字:c++& makfile项目& visualGDB& 断点调试,目标是希望通过visualGDB来debug项目,方便后续对程序的理解。首先我在GitHub上clone一个项目:https://github.com/gjkennedy/paropt,它是用来并行计算优化的一个库,由makefile来组织,C++编写,在win10下子系统Ubuntu18.04(这是我的Linux环境)clone好,make项目没有问题;然后新建visual GDB-cmake项目,build在Linux,代码存在本地Windows,同步到Linux上,debug正常,说明环境可以正常debug;下面选择利用其中一个examples:rosenbrock测试,rosenbrock依赖paropt–src生成的libparopt.a,将需要的文件复制到建立好的visualGDB目录下,修改makefile中的文件路径,将rosenbrock.cpp复制到根目录下,修改makefile;在project中选择build模式为custom,在vsgdb界面build,即自动识别文件夹中的makefile。build后就出现99个error:undefined reference “ompi_mpi_…”的错误;但是如果我不以新建项目的方式,直接以导入项目的方式,那么程序build就会成功,只是不能加断点。也不知您接触过么?麻烦了(背景的线条随着鼠标的所在而聚集,有了双层的感觉,使得文档看起来更立体,感觉注意力好像集中了,赞)