gpt4 book ai didi

c++ - 在Linux中构建共享库时如何使链接器因 undefined reference 而失败

转载 作者:行者123 更新时间:2023-12-02 10:07:36 25 4
gpt4 key购买 nike

我正在尝试在Ubuntu中使用C++构建共享库(我将在运行时使用dlopen加载该共享库),但是我注意到即使缺少一些依赖关系,共享库也可以正常构建。如果我要生成一个可执行文件,我会收到undefined reference链接器错误,这是我想在这里看到的。

这个示例中可能有太多细节,但是我不确定如何缩减它并使其具有代表性。

基数

class Base{
public:
virtual void foo()=0;
};

extern "C" {
Base* CreateBase();
}
extern "C" {
void DestroyBase(Base* b);
}

派生

#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;
}
}

派生的

#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();
}

其他类

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

最佳答案

在构建并希望避免这种情况时,我使用以下选项编译该库:-Wl,--no-allow-shlib-undefined -Wl,-z,defs
当与第二个选项结合使用时,在代码中 undefined symbol 的情况下,第一个选项导致共享库的链接失败,从而导致链接器报告丢失的符号。

通过在链接时检测符号,可以很好地防止在运行时丢失符号。但是,我确实需要将.so与它使用的所有库链接,否则它将无法构建。

样本(src.c):

#include <math.h>

extern
double share_the_stuff(double val)
{
return acos(val * val);
}

缺少符号的构建:
gcc -shared -o src.so src.c -Wl,--no-allow-shlib-undefined -Wl,-z,defs
/usr/bin/ld: /tmp/ccFmD5uY.o: in function `share_the_stuff':
src.c:(.text+0x17): undefined reference to `acos'
collect2: error: ld returned 1 exit status

libm.so中的链接:
gcc -shared -o src.so src.c -Wl,--no-allow-shlib-undefined -Wl,-z,defs -lm

缺少内部符号时,其行为相同。

关于c++ - 在Linux中构建共享库时如何使链接器因 undefined reference 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59399803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com