【问题标题】: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*)”的未定义引用是编译器或链接器错误?

【问题讨论】:

    标签: c++ linux linker shared-libraries


    【解决方案1】:

    这是一个链接器错误(尽管我认为它通常不包含 'char*' 位),所以它似乎找不到您的库或库不包含该函数。后者也可能意味着它确实包含实际功能,但名称不同;确保两个项目都编译为 C 而不是 C++。

    编辑:我错过了您的程序是 C++(这也解释了更详细的链接器消息)。在这种情况下,如果库是 C 语言,则应在 CEDD 的声明中添加 extern "C"(有条件地,因此仅在使用 C++ 时使用)。

    【讨论】:

    • 太棒了!你说的对!现在我使用 C 程序来测试 C 库 =) 但是当库连接时(路径)我没有编译任何二进制文件(我也没有得到任何错误)。当我删除 lib 的所有路径时,我会在输出中得到一个可执行文件!我怎么会这样?
    • 我没有使用 eclipse 的经验,也没有错误消息,我一无所知。也许您可以获取它以某种方式执行的命令的日志。
    【解决方案2】:

    您确定在构建时链接了为descriptor.c 生成的目标代码吗?

    【讨论】:

    • 不,我不确定。我需要这样做吗?我以为我只需要一个 *.so 文件和一个头文件 *.h。
    • 查看内部,以便在那里定义 CEDD 符号。然后,确保 .so 文件已链接(不幸的是,我不是 Eclipse 方面的专家,无法提供有关环境配置的详细信息……)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2023-04-09
    • 1970-01-01
    • 2013-06-21
    • 2013-02-01
    相关资源
    最近更新 更多