函数void foo()
由两个dll D1和D2导出。
主程序链接到D1和D2并调用foo。
void foo();
int main()
{
foo();
}
这在Visual Studio中成功编译和链接。当我运行程序时,我注意到D1的foo版本被调用。
视觉工作室不应该发出链接器错误,因为它找到了foo的两个匹配项吗?在主程序的配置属性中 - >链接器 - > CommandLine,我注意到它在D2.lib之前有D1.lib。这就是为什么D1的foo版本与Main相关联的原因(在命令行中首先出现的是确定性链接)?
答案 0 :(得分:1)
要调用.dll
或.lib
中的函数,您需要包含带有函数定义的头文件。
在您的情况下,您最终只包含两个标头中的一个,或直接在cpp中编写函数原型。如果你包括两个标题,编译器会给你一个模糊调用的错误。
如果您只包含两个标头中的一个,并且编译器已确定知道要调用哪个函数(例如,对于某些#pragma comment(lib...)
,编译器将调用预期的函数。
如果没有.dll
或.lib
头文件的指示,请参阅编译器调用第一个处理的文件。