在Linux中构建共享库时如何使链接器因未定义的引用而失败

问题描述 投票:0回答:1

我正在尝试在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加载它),但是我注意到即使缺少一些依赖关系,共享库也可以很好地构建。如果...

c++ linux linker shared-libraries
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.