编译报错求助:SpeakInternal链接规格不兼容等3个代码错误
解决DLL导出函数中的三个编译错误
我来帮你逐一拆解这三个错误的根源和修复方案:
错误1:SpeakInternal(声明于voice.cpp第13行)的链接规格不兼容
问题出在链接规则不匹配:你在voice.h里用extern "C"包裹了函数声明,这会告诉编译器用C语言的无修饰命名规则处理这些函数;但voice.cpp里的SpeakInternal定义是默认的C编译模式,C会对函数名做「名字修饰」(name mangling),导致链接器找不到对应的函数实现,就报了链接规格不兼容的错误。
修复方法:
在voice.cpp的SpeakInternal定义前加上extern "C",让实现也遵循C语言的链接规则:
extern "C" void SpeakInternal(std::wstring uText, std::wstring uPath) { CApp nApp; //nApp.SpeakThis() }
错误2:wstring:未声明的标识符
wstring是C++标准库的字符串类型,它属于std命名空间,而且必须包含<string>头文件才能使用。你的代码里既没加#include <string>,也没给wstring加上std::前缀,编译器根本不知道这个类型是什么,自然会报错。
修复方法:
- 先在
voice.h的开头添加头文件引用:
#include <string>
- 把所有
wstring替换成std::wstring(推荐这种方式,避免头文件里的命名污染),修改后的voice.h声明如下:
#include <string> extern "C" { __declspec(dllexport) void __cdecl DoCompile(); __declspec(dllexport) void __cdecl SpeakInternal(std::wstring uText, std::wstring uPath); };
错误3:语法错误:标识符“uText”前缺少“)”
这个错误是错误2引发的连锁问题。因为编译器识别不了wstring,会把它当成一个普通变量名来解析,这样函数声明就变成了void __cdecl SpeakInternal(wstring uText, ...)——编译器以为wstring是第一个参数的名字,后面的uText就成了多余的标识符,自然会提示语法错误。只要解决了错误2,这个问题会自动消失。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

