Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C++程序中出现undefined reference to ......

Posted on 2019-02-26 16:28 Prayer 阅读(698) 评论(0)  编辑 收藏 引用 所属分类: LINUX/UNIX/AIX

在C++代码中调用C的库文件,需加上extern "C",用来告知编译器:这是一个用C写成的库文件,请用C的方式连接他们。

Undefined reference to 错误:这类错误是在连接过程中出现的,可能有两种原因∶

一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这 需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;

1) 可以头文件中类加上

  #ifndef xxx_H
  #define xxx_H

  namespace xxx{

  };

  #endif

  cpp文件中包含头文件,using namespace xxx; 或者 其他访问方式(自行百度namepace 使用方法)

2)若全局 namespace xxx 被class xxx 覆盖,请加上::

3) 请注意原来的makefile文件是否包含新增的文件,并且逻辑包含关系正确。

二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有 给定相应的函数库的名称,或者是该档案库的目录名称有问题.

   在使用厂商新提供的库文件时,遇到了新问题,库中的函数程序不识别,同样的方法在使用以前的库时是可行的,在CSDN上求助并查阅一些资料后,问题已经解决。
1)使用库的时候首先要明确库(或者头文件)是用什么编写的,如果是用C++编写的,那么在MFC中可以直接使用,如果是用c编写的,那么在#include头文件的时候要加上
extern “C”{
#include “OOXX.h”
}
注意格式换行要正确。
2)为什么要如1)中那样操作呢,因为在c++中编译的方法和c不用,这是由于函数的重载造成的。在c中不涉及重载,如函数func(int a,float b)编译成_func.在c++中涉及重载,如果只凭函数名是不足以判断是使用的哪个函数,所以编译的时候要加上变量,如函数func(int a,float b)编译成_func_int_float,这样不但确定了函数名,还确定了使用哪中重载。正式由于以上的不同,使得c中编的函数不能在c++中直接使 用,c++中为了兼容c的代码,提出了extern “C”的方法,在编译声明了extern “C”的函数函数时,会按照c语言的方法编译。
如果不加extern “C”,在编译的时候会出现link错误:error link 2001:unresolved extern symbol “long __stdcall func(int a,float b)@QDASCFQAE@”之类的错误,说明编译器没有识别出函数func


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理