对共享库函数的未定义引用

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 方面的专家,无法提供有关环境配置的详细信息……)

以上是关于对共享库函数的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

使用 MinGW 对 DevIL 函数的未定义引用

静态库的未定义引用和奇怪的内容

对 __isoc99_sscanf 的未定义引用

对 `CORBA::ValueBase::ValueBase()' 的未定义引用,我该如何解决? (在omniORB中使用哪个库)

即使在链接库时,也会获得对 OpenCV 元素的未定义引用。使用 CMake

如何在链接到静态库的 DEV-CPP 中构建控制台应用程序时解决对 _imp__** 的未定义引用?