作为问题MSVC unresolved external symbol linking executables的延伸。 A
包含一个类P
,其中包含两个成员函数F
和G
,还包含全局P MyP
。我正在尝试从可执行文件MyP.F
调用函数T
。我终于通过了链接部分,但现在它在运行时因异常而失败。
A.cpp
struct P {
void F();
void G();
} MyP;
P::F() {
}
P::G() {
}
int main() {
MyP.F();
MyP.G();
}
T.cpp
struct P {
void F();
void G();
} MyP;
int main() {
MyP.F();
MyP.G();
}
我可以在T
中在Visual Studio 2008中调用F
的行中放置一个断点,但是当我按下按钮进入或跳过时,我得到一个异常{ {1}}。当我查看调用堆栈时,它会显示
fe5ca589()
A.exe!G()+ 0x60a6个字节
[下面的框架可能不正确和/或缺失,没有为A.exe加载符号]
这两个项目都是同一个Visual Studio解决方案的一部分,并且First-chance exception at 0xfe5ca589 in A.exe: 0xC0000005: Access reading location 0xfe5ca589
已正确设置为A
的依赖项,并且似乎正确链接,但我不能介入它。有没有人有洞察力如何使Visual Studio加载T
的符号所以我可以进入它并找到错误? (或者如果某些内容链接起来导致错误?)
答案 0 :(得分:1)
可执行文件没有允许在备用地址加载的元数据,A.EXE
无法加载到T.EXE
所需的地址,因为T.EXE
的代码已经存在了。
您可以通过更改(已确认,no you can't)A.EXE
的默认加载地址来解决此问题(构建它时,它是一个链接器选项),但正确的解决方案是使用DLL。
提供从.EXE
文件导出以允许插件DLL调用主应用程序中的函数。它们并不意味着允许加载.EXE
,就像它是DLL一样。