0
votes

In short: on Visual C++ 2015, I get a linker error complaining about the absence of symbols that are present in the .lib file I link against.


In long: While compiling-and-liking some program from the command line with cl.exe I get the following as the first of many errors:

main.obj : error LNK2001: unresolved external symbol "protected: static struct wxEventTable const wxApp::sm_eventTable" (?sm_eventTable@wxApp@@1UwxEventTable@@B)

AFAIK, this long line says that my main.obj refers to a function to which a symbol ?sm_eventTable@wxApp@@1UwxEventTable@@B is associated, but that the linker could not find this symbol in the (long) list of libs that I provided on the command line.

I compile in /MD mode. Don't know if it helps, hurts, or has no importance here.

One of the files I link with is wxmsw31u_core.lib and doing

dumpbin /headers wxmsw31u_core.lib > here.txt

gives a long file containting the following

  Version      : 0
  Machine      : 8664 (x64)
  TimeDateStamp: 56D46194 Mon Feb 29 16:19:48 2016
  SizeOfData   : 00000045
  DLL name     : wxmsw310u_core_vc140_x64.dll
  Symbol name  : ?sm_eventTable@wxApp@@1UwxEventTable@@B (protected: static struct wxEventTable const wxApp::sm_eventTable)
  Type         : data
  Name type    : name
  Hint         : 14083
  Name         : ?sm_eventTable@wxApp@@1UwxEventTable@@B

From this I infer that wxmsw31u_core.lib this is an "import library" : in other words that means that this lib does not contain the code but just refers to the dll file wxmsw310u_core_vc140_x64.dll that actually contains the code.

The latter wxmsw310u_core_vc140_x64.dll file indeed mentions ?sm_eventTable@wxApp@@1UwxEventTable@@B as I checked:

dumpbin /EXPORTS wxmsw310u_core_vc140_x64.dll > here2.txt

gave

  14084 3703 0057F008 ?sm_eventTable@wxApp@@1UwxEventTable@@B = ?sm_eventTable@wxApp@@1UwxEventTable@@B (protected: static struct wxEventTable const wxApp::sm_eventTable)

I note that the first number is equal to the hint of the previous header plus one. I suppose this is normal?

I took the time to check the DLL as above but AFAIK, the DLL is not required in the linking process (it is required when you call the .exe that is produced).

All in all, it seems everything is there and it should link, so I am at a loss to determine what's wrong here.


Edit

I partially solved the problem by compiling myself the libary instead of using the compiled binaires for Windows provided by wxWidgets: I can now compile my program and all is well.

Well, not all: the initial question remains. I had a situation where I tried to link an obj with a lib to get an exe, the obj refers to a symbol whose mangled name is present verbatim in the lib, the linker does load the obj and lib (confirmed using /VERBOSE), yet the linker refuses to consider the symbol as "resolved". Why?

I'll create a new question where I'll ask for explanations about the conditions to be resolved.

1

1 Answers

0
votes

AFAIK, this long line says that my main.obj refers to a function to which a symbol ?

Yes, linker is not able to find sm_eventTable@wxApp@@1UwxEventTable@@B on your paths specified.

Check that you have properly setup Additional Library Path parameter and that target platform of your application is /Machine:X64