用C语言编写(进入C ++项目):
我在VS08下有两个相同解决方案的项目。一个是DLL文件,另一个(“runner”)是用于使用/测试DLL文件的控制台应用程序。头文件有一个包含所有函数的头文件(__declspec(dllexport))。当我使用没有任何参数的函数时,通过运行器控制台应用程序,它们运行正常。当我尝试使用参数调用函数时,我无法解析符号...错误。奇怪的是,VS08识别该功能,我可以通过右键菜单从跑步者main()打开它,但它无法找到它。
值得一提的是我包含头文件而不是用函数指针导入DLL ...我的感觉是函数在编译过程中以某种方式重命名,链接器无法找到带参数的函数。如果我能够看到新名称列表(在目标文件中?),也许我可以将它们包含在头文件中以解决这个问题?
感谢。
答案 0 :(得分:2)
用C语言编写(进入C ++项目):
这可能是一个相当不错的领先优势。 C程序不能使用用C ++编写的函数。使用__declspec(dllexport)时,函数将以其C ++名称导出。由编译器进行修饰,这是一种允许重载函数正确链接的技巧。 C编译器不应用相同类型的装饰,链接器会抱怨它无法找到该功能。
要使其工作,您必须使用extern "C"
声明符声明该函数。使.h文件看起来像这样:
#ifdef __cplusplus
extern "C" {
#endif
#undef DLLEXPORT
#ifdef BUILDING_MYDLL
# define DLLEXPORT __declspec(dllexport)
#else
# define DLLEXPORT __declspec(dllimport)
#endif
DLLEXPORT void Foo(int arg);
// etc..
#ifdef __cplusplus
}
#endif
在DLL项目中,使用Project + Properties,C / C ++,Preprocessor并将BUILDING_MYDLL添加到预处理器定义设置。
这个宏观疯狂的简短解释:#ifdef __cplusplus确保所有DLL声明在由C ++编译器编译时声明为extern“C”,以便它们匹配C编译器符号。 DLLEXPORT宏确保在构建DLL时导出函数,在链接另一个项目中的DLL导入库时导入该函数。
您可以通过在DLL上使用/ exports选项运行dumpbin.exe实用程序来获取其他疑难解答。它显示了导出函数的确切名称。从Visual Studio命令提示符运行它。您在输出中看到的名称与链接器错误消息之间的不匹配是一个明显的麻烦迹象。
答案 1 :(得分:0)
首先关闭:智能感知它('open for the rightclick menu'
eeeeck?)不是证据;它证明你把声明放在头文件中;
你可能对名称错误的事情是正确的:如果你有C外部,你需要在extern "C" {}
块内声明它们:
extern "C" {
void dostuff(int param1, char* param2);
}
而不是
extern void dostuff(int param1, char* param2);
最灵活的方法可能是有条件地在完整的C头文件周围包含extern“C”:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
有关详细信息,请参阅MSDN