C ++共享库未定义引用

时间:2015-02-09 19:19:23

标签: c++ linux reference g++ undefined

我有类似这些文件的内容:

libfoo.h

class foo
{
public:
foo() = default;
virtual ~foo();
};

libfoo.cpp

#include "libfoo.h"

foo::~foo() { /* code here */ }

TEST.CPP

#include <libfoo.h>
int main()
{
   foo f;
}

我将libfoo.h和libfoo.cpp编译成一个共享库,一切都很好。 但是当我尝试在test.cpp中使用库时,我得到了对析构函数~foo()的未定义引用。

如果我直接在libfoo.h中定义析构函数,则不会发生此错误。我在我的库中的类外定义的所有函数都有这个问题,所以我猜测它与编译过程有关(但它编译得很好)

我像这样编译库:

g++ -std=c++0x -Wall -Werror -fPIC  -c -o libfoo.o libfoo.cpp
g++ -shared libfoo.o -o libfoo.so

关于我可能做错什么的任何想法? (我声明inclass的所有函数,如模板函数都可以正常工作并且不会导致任何未定义的引用)

1 个答案:

答案 0 :(得分:0)

我试图重现错误,但我失败了。

我创建了文件(略有修改):

// libfoo.h
struct foo { virtual ~foo(); };

// libfoo.cpp
#include "libfoo.h"
foo::~foo() {}

// test.cpp
#include "libfoo.h"
int main() { foo f; }

这样建造:

$ g++ -std=c++0x -Wall -Werror -fPIC  -c -o libfoo.o libfoo.cpp
$ g++ -shared libfoo.o -o libfoo.so
$ g++ test.cpp -L. -lfoo

并且像这样跑:

$ env LD_LIBRARY_PATH=. ./a.out

我没有错误。您确定代码有问题吗?