Access violation on static library call
As an extension of question MSVC unresolved external symbol linking executables. A
contains and a class P
with two member functions F
and G
, and also contains a global P MyP
. I'm attempting to call functions MyP.F
, from Executable T
. I finally got past the linking part, but now it fails at runtime with the exception.
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();
}
I can put a breakpoint in T
at the line where it calls F
in Visual Studio 2008, but when I press the button to step in, or to step over, I get an exception First-chance exception at 0xfe5ca589 in A.exe: 0xC0000005: Access reading location 0xfe5ca589
. When I look at the call stack, it shows
fe5ca589()
A.exe!G() + 0x60a6 bytes [Frames below may be incorrect and/or missing, no symbols loaded for A.exe]
Both projects are p开发者_如何学JAVAart of the same Visual Studio solution, and A
is properly set as a dependancy for T
, and seems to be linking correctly, but I can't step into it. Does anyone have insights how to make Visual Studio load the symbols for A
so I can step into it and find the error? (Or if something is linked funny causing the error?)
Executables don't have the metadata allowing them to be loaded at an alternate address, and A.EXE
can't load into T.EXE
at its desired address, because T.EXE
's code is already there.
You might be able to work around this by changing the default load address of (Confirmed, no you can't)A.EXE
(when building it, it's a linker option), but the correct solution is to use a DLL.
Exports from .EXE
files are provided to allow plugin DLLs to call functions in the main application. They aren't meant to allow loading the .EXE
like it was a DLL.
精彩评论