我有类似这些文件的内容:
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的所有函数,如模板函数都可以正常工作并且不会导致任何未定义的引用)
答案 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
我没有错误。您确定代码有问题吗?