当前位置: 首页 > 面试题库 >

C ++共享库对`FooClass :: SayHello()'的未定义引用

柴茂材
2023-03-14
问题内容

我正在制作一个C ++共享库,当我编译使用该库的主exe时,编译器会给出以下信息:

main.cpp:(.text+0x21): undefined reference to `FooClass::SayHello()'
collect2: ld returned 1 exit status

库代码:

fooclass.h

#ifndef __FOOCLASS_H__
#define __FOOCLASS_H__

class FooClass 
{
    public:
        char* SayHello();
};

#endif //__FOOCLASS_H__

fooclass.cpp

#include "fooclass.h"

char* FooClass::SayHello() 
{
    return "Hello Im a Linux Shared Library";
}

编译:

g++ -shared -fPIC fooclass.cpp -o libfoo.so

主要:main.cpp

#include "fooclass.h"
#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    FooClass * fooClass = new FooClass();

    cout<< fooClass->SayHello() << endl;

    return 0;
}

编译:

g++ -I. -L. -lfoo main.cpp -o main

该机器是Ubuntu Linux 12

谢谢!


问题答案:
g++ -I. -L. -lfoo main.cpp -o main

是问题。最新版本的GCC要求您按照相互依赖的顺序放置目标文件和库-因此,根据经验法则,必须将库标志作为链接器的最后一个开关;即写

g++ -I. -L. main.cpp -o main -lfoo

代替。



 类似资料:
  • 问题内容: 两个共享库liba.so和libb.so。liba.so使用libb.so。所有c文件都使用-fPIC编译。链接使用- shared。当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号…我们得到“未定义符号”错误。我们可以dlopen libb.so没有错误。我们知道liba正在找到libb,因为我们没有得到文件未找到错误。删除libb.so时,出现文件未找到

  • 我正在尝试建立一个共享库,可以用来访问本机蓝牙API函数。我目前正试图编译一个c文件:https://android.googlesource.com/platform/external/bluetooth/bluedroid/ 每当我尝试将这些代码中的任何一个编译为共享库时,我都会收到许多未定义的引用错误...它看起来像是头文件引用的每个函数。在我最近的尝试中,我将整个Bluedroid/bta

  • 问题内容: 这有什么问题吗?我有以下简单的课程: 在运行一个简单的compile()之后,出现以下错误: 在共享库上运行nm表示实际上已找到它: 这是在Ubuntu 12.04上发生的。该 libmnl-dev的 和 libmnl0 包安装。的输出表明正使用该* .so文件: 问题答案: 库必须在使用它们的对象之后列出(更确切地说,仅当库包含满足遇到未定义引用的符号时,才使用库)。将移至命令末尾。

  • 问题内容: 我在使用C ++(Eclipse)的Linux中工作,并且想要使用一个库。Eclipse显示了一个错误: 你知道解决方案吗? 这是我的代码: 问题答案: 您必须针对libdl进行链接,添加 -ldl 到您的链接器选项

  • 问题内容: 我试图将库包含在我的项目中,并且一直面临着同样的问题。我在使用Codeblocks IDE的Ubuntu 12.10上,尝试手动读取站点上的说明来安装库,但是在头文件以及使用前需要构建的库中出现错误。 然后,我通过terminalby安装了库。此后,在我的代码块程序中,可以包含类似的标题,但是当我尝试包含Filesystem库的标题( )时,出现以下错误: 我不确定如何解决此错误(特别

  • 我正试图将库包括在我的项目中,并一直面临着同样的问题。我在使用Codeblocks IDE的Ubuntu12.10上,尝试手动安装库,阅读网站上的说明,但在使用库之前,得到了带有标题的错误以及要构建的错误。 然后,我通过terminalby