You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下使用dlclose与dlopen重载动态库,Clang编译正常但GCC编译异常

Linux下使用dlclose与dlopen重载动态库,Clang编译正常但GCC编译异常

最近碰到一个挺头疼的问题,我写了一段循环动态加载、调用、卸载动态库的代码,逻辑上每次循环都应该重新加载库,但实际测试时出现了明显差异:

先看主程序的核心代码:

while (true) {
    void* lib = dlopen("bin/liblibrary.so", RTLD_NOW | RTLD_LOCAL);
    assert(lib);

    typedef void (*f_t)(void);

    f_t f = (f_t)dlsym(lib, "foo");
    assert(f);

    f();

    int res = dlclose(lib);
    assert(!res);
}

对应的动态库代码非常简单,就是一个基础的打印函数:

extern "C" void foo() {
  printf("hello from foo\n");
}

这段代码的预期行为是每次循环都重新加载动态库——如果修改库的代码后重新编译,主程序应该立刻执行新的foo逻辑。

测试环境为Arch Linux:

  • 用Clang 17.0.6编译时,完全符合预期:修改库代码重新编译后,主程序循环调用的就是新的foo函数。
  • 但用GCC 14.1.1编译相同代码(主程序用g++ main.cpp -o main,库用g++ -shared -fPIC -o liblibrary.so library.cpp),异常就出现了:即使重新编译了动态库,主程序还是一直调用旧的foo函数,完全没有加载新的库内容。

备注:内容来源于stack exchange,提问作者Jakub Arnold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 11:07:59