我正在尝试在Ubuntu中使用C ++构建共享库(我将在运行时使用dlopen
加载该库),但是我注意到即使缺少一些依赖关系,共享库也可以正常构建。如果我要生成一个可执行文件,则会收到undefined reference
链接器错误,这是我想在这里看到的。
此示例中可能有太多细节,但是我不确定如何缩减它并使其具有代表性。
Base.h
class Base{
public:
virtual void foo()=0;
};
extern "C" {
Base* CreateBase();
}
extern "C" {
void DestroyBase(Base* b);
}
Derived.h
#include "Base.h"
class Derived : public Base {
public:
void foo();
};
extern "C" {
Base* CreateBase() {
return new Derived;
}
}
extern "C" {
void DestroyBase(Base* b) {
delete b;
}
}
Derived.cc
#include "Derived.h"
#include "OtherClass.h"
#include <iostream>
void Derived::foo(){
std::cout << "Derived::foo()" << std::endl;
std::cout << "Calling OtherClass::bar()" << std::endl;
OtherClass other;
other.bar();
}
OtherClass.h
class OtherClass{
public:
void bar();
};
我用于建立共享库的命令行是
g++ -shared -fPIC -o libtest_dll.so Derived.cc
问题是我没有由OtherClass::bar()
调用的Derived::foo()
定义,但是libtest_dll.so
的构建没有错误或警告。据我了解,在Windows的Visual Studio中,如果我要用此代码构建DLL,它将无法链接。如何在Ubuntu / Linux中使用g++
来获得该行为?
在Ubuntu 19.04上运行g ++ 8.3.0-6,>
我正在尝试在Ubuntu中使用C ++构建共享库(我将在运行时使用dlopen加载它),但是我注意到即使缺少一些依赖关系,共享库也可以很好地构建。如果...