制作C++静态库供C程序调用出现undefined reference报错如何解决
问题根因
- 核心为C++与C语言的符号命名规则不兼容导致的链接错误:
fileselector.cpp为C代码,编译时会按照C的*名字修饰(Name Mangling)*规则处理函数名,open_file_dialog编译后生成的符号名会被修改为类似_Z16open_file_dialogv的带修饰字符串- 测试代码
main.c是C语言代码,用gcc编译C代码时会查找未经修饰的C风格符号open_file_dialog,和静态库中的修饰后符号完全不匹配,因此链接器ld报未定义引用错误。
- 补充:编译静态库时将
.h头文件传入gcc属于冗余操作,头文件会被fileselector.cpp中的include指令自动引入,不需要额外作为编译参数传入,不过该操作不会引发错误。
解决方案
以下两种方案二选一即可:
方案1:头文件添加C兼容声明(推荐,适配C/C++两种调用场景)
修改fileselector.h,用extern "C"包裹函数声明,告诉C++编译器这部分函数需要按照C语言规则生成符号:
#ifndef FILE_SELECTOR #define FILE_SELECTOR #ifdef __cplusplus extern "C" { #endif const char *open_file_dialog(); const char *save_file_dialog(); #ifdef __cplusplus } #endif #endif
修改完成后重新编译静态库,再执行原测试编译命令即可正常链接。
方案2:用C++编译器编译测试代码
如果测试代码允许用C++编译,直接将测试编译命令中的gcc替换为g++即可:
$ g++ main.c -L. -lfileselector -o main
C编译器会按照C的符号规则匹配静态库中的函数,也可以正常链接。
内容的提问来源于stack exchange,提问作者aszswaz
相关产品推荐
相关产品推荐

