【发布时间】:2017-05-08 20:38:37
【问题描述】:
在尝试在 Visual Studio 2017 中复制此 question 中的行为时,我发现不是将 &FuncTemplate<C> 链接到完全相同的地址,而是将函数 template<> FuncTemplate<C>() {} 复制到 dllA 和 dllB 中,以便始终对应的测试程序返回not equal。
解决方案是用 3 个 Win32Projects 重新设置的,一个作为 ConsoleApplication,另一个作为 DLL。为了链接 DLL,我将它们添加为对控制台项目的引用(手动链接也不起作用)。我对代码所做的唯一更改是将__declspec(dllexport) 添加到a() 和b()。
这种行为标准符合吗?似乎应该在这里使用 ODR 来折叠函数的副本。有没有办法在另一个问题中看到相同的行为?
模板.h
#pragma once
typedef void (*FuncPtr)();
template<typename T>
void FuncTemplate() {}
class C {};
a.cpp - dll 项目 1
#include "Template.h"
__declspec(dllexport) FuncPtr a() {
return &FuncTemplate<C>;
}
b.cpp - dll 项目 2
#include "Template.h"
__declspec(dllexport )FuncPtr b() {
return &FuncTemplate<C>;
}
main.cpp - 控制台项目
#include <iostream>
#include "i.h"
// seems like there is no __declspec(dllimport) needed here
FuncPtr a();
FuncPtr b();
int main() {
std::cout << (a() == b() ? "equal" : "not equal") << std::endl;
return 0;
}
【问题讨论】:
-
该标准不包括 DLLs
标签: c++ visual-c++ dll visual-studio-2017