静态库调用上的访问冲突

时间:2011-09-15 21:29:04

标签: c++ visual-studio-2008 linker debug-symbols

作为问题MSVC unresolved external symbol linking executables的延伸。 A包含一个类P,其中包含两个成员函数FG,还包含全局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的符号所以我可以进入它并找到错误? (或者如果某些内容链接起来导致错误?)

1 个答案:

答案 0 :(得分:1)

可执行文件没有允许在备用地址加载的元数据,A.EXE无法加载到T.EXE所需的地址,因为T.EXE的代码已经存在了。

您可以通过更改A.EXE的默认加载地址来解决此问题(构建它时,它是一个链接器选项),但正确的解决方案是使用DLL。(已确认,no you can't

提供从.EXE文件导出以允许插件DLL调用主应用程序中的函数。它们并不意味着允许加载.EXE,就像它是DLL一样。