显式链接动态库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
相关产品推荐
相关产品推荐

