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

马谦马谦马谦 C/C++21,247字数 583阅读 1 分 56 秒阅读模式

一、问题描述

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

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

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

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

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

二、重现

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

add.hadd.c 的内容:

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

此时编译就报错:

解决方案

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

再编译就能通过了。

  最后更新:2018-10-18
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2018 年 10 月 8 日 18:50:15
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/compile-error-undefined-reference-to-xxx.html
C++文件输入输出流fstream的基本用法 C/C++

C++文件输入输出流 fstream 的基本用法

一、文件流 C++的 IO 类中定义了三个文件读写流 fstream 、 ifstream 以及 ofstream,它们都继承于相同的父类 istream,通过不同的实现以实现不同的文件流操作。 三者的区别为: if...
C++11中const_cast的真实使用场景 C/C++

C++11 中 const_cast 的真实使用场景

一、 const 和成员函数的故事 const 的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候 const 限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内...
C++11中的override和final关键字 C/C++

C++11 中的 override 和 final 关键字

一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过: virtual int func() override {} 不通过的原因是:同时使用 virtual 和 overri...
评论  2  访客  2
    • I have a dream
      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 就会成功,只是不能加断点。也不知您接触过么?麻烦了 (背景的线条随着鼠标的所在而聚集,有了双层的感觉,使得文档看起来更立体,感觉注意力好像集中了,赞)

    匿名

    发表评论

    匿名网友
    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
    确定

    拖动滑块以完成验证