对共享库函数的未定义引用
Posted
技术标签:
【中文标题】对共享库函数的未定义引用【英文标题】:undefined reference to the shared library function 【发布时间】:2009-06-12 11:39:11 【问题描述】:我在 Linux 中实现了一个共享库并尝试对其进行测试,但我收到错误“未定义对 `CEDD(char*)' 的引用”。
我使用带有以下参数的 Eclipse:
包含文件的路径(这里是 一切正常) 库的路径 和它的名字。路径正确且 名称为 WISE_C(全名: libWISE_C.so)我的代码:
我用于测试的测试程序:
#include <iostream>
#include <Descriptor.h>
int main()
char* path = "/export/home/pdmazubi3/workspace/proj1/src/pic.jpg";
double * cedd = CEDD(path); ///// <-ERROR!
std::cout << "!!!Hello World!!!" << cedd[1];
return 0;
头描述符.h:
double* CEDD(char* path);
Descriptor.c 的一部分,具有理想的功能:
#include "Descriptor.h"
#include "highgui.h"
#include "cv.h"
double* CEDD(char* path)
IplImage* srcImg;
IplImage* ImageGrid;
...
我在做什么?我在网上查了很多文章,但没有找到解决办法。
对“CEDD(char*)”的未定义引用是编译器或链接器错误?
【问题讨论】:
【参考方案1】:这是一个链接器错误(尽管我认为它通常不包含 'char*' 位),所以它似乎找不到您的库或库不包含该函数。后者也可能意味着它确实包含实际功能,但名称不同;确保两个项目都编译为 C 而不是 C++。
编辑:我错过了您的程序是 C++(这也解释了更详细的链接器消息)。在这种情况下,如果库是 C 语言,则应在 CEDD
的声明中添加 extern "C"
(有条件地,因此仅在使用 C++ 时使用)。
【讨论】:
太棒了!你说的对!现在我使用 C 程序来测试 C 库 =) 但是当库连接时(路径)我没有编译任何二进制文件(我也没有得到任何错误)。当我删除 lib 的所有路径时,我会在输出中得到一个可执行文件!我怎么会这样? 我没有使用 eclipse 的经验,也没有错误消息,我一无所知。也许您可以获取它以某种方式执行的命令的日志。【参考方案2】:您确定在构建时链接了为descriptor.c 生成的目标代码吗?
【讨论】:
不,我不确定。我需要这样做吗?我以为我只需要一个 *.so 文件和一个头文件 *.h。 查看内部,以便在那里定义 CEDD 符号。然后,确保 .so 文件已链接(不幸的是,我不是 Eclipse 方面的专家,无法提供有关环境配置的详细信息……)以上是关于对共享库函数的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章
对 `CORBA::ValueBase::ValueBase()' 的未定义引用,我该如何解决? (在omniORB中使用哪个库)