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

显式链接动态库libsort.so时出现undefined symbol错误求助

问题解决:动态库显式链接找不到mergeSort符号

核心原因

C++编译器会对函数名进行名字修饰(Name Mangling),生成包含函数参数类型等信息的唯一符号名,而dlsym是按传入的原始字符串(比如"mergeSort")查找符号,自然找不到被修饰后的实际符号。

解决方案

方案1:用extern "C"导出函数(推荐)

通过extern "C"告诉编译器按C语言规则生成符号,避免名字修饰。

修改sort.h:

#ifdef __cplusplus
extern "C" {
#endif

void merge(int array[], int const left, int const mid, int const right);
void mergeSort(int array[], int const begin, int const end);
void printArray(int A[], int size);
int rand_int(int min, int max);

#ifdef __cplusplus
}
#endif

修改sort.cpp,直接包含修改后的头文件即可:

#include "sort.h"
#include <bits/stdc++.h>
#include <iostream>

// 后续函数定义保持不变...

重新编译动态库:

g++ -fPIC -shared sort.cpp -o libsort.so

生成的动态库中,函数符号会保持原始的mergeSort、printArray等名称,dlsym可正常查找。

方案2:使用修饰后的符号名查找

若不想修改库代码,先查看动态库中实际的符号名:

nm -D libsort.so | grep mergeSort

输出类似:

0000000000001234 T _Z9mergeSortPiii

在example.cpp中用该修饰名调用dlsym:

merge_s = (void (*)(int[], int, int))dlsym(ext_library, "_Z9mergeSortPiii");

注意:不同编译器(gcc/clang)的名字修饰规则可能有差异,此方法通用性较差,不推荐。

额外检查

确保动态库编译时使用-fPIC和-shared参数,生成正确的共享库:

g++ -fPIC -shared sort.cpp -o libsort.so

内容的提问来源于stack exchange,提问作者user23561003

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:57:27