Ayende @ Rahien

Refunds available at head office

Reasons to hate C/C++ work

The following code won’t link. For fun, the set_mapsize and set_flags are both defined in the same file. Both for .h & .c, and the set_mapsize works just fine.

image

Tags:

Posted By: Ayende Rahien

Published at

Originally posted at

Comments

tobi
08/04/2013 01:01 PM by
tobi

I never understood why the header-based link system is needed. .NET and Java don't need them either, and they work much better.

Ayende Rahien
08/04/2013 01:22 PM by
Ayende Rahien

tobi, They are needed because this way, you could write a single pass compiler. It meant very little memory was needed to actually do the compilation

eti
08/04/2013 02:37 PM by
eti

Maybe the pre-processor conditionaly stripps the definition away?

Ayende Rahien
08/04/2013 02:47 PM by
Ayende Rahien

Eti, Nope, I made sure of that.

zdeslav
08/04/2013 02:50 PM by
zdeslav

Does dumpbin show the correct symbol in corresponding obj file?

Ayende Rahien
08/04/2013 03:03 PM by
Ayende Rahien

D:\Work\lightningdb-win\liblmdb\Release [master +10 ~5 -0 !]> &"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\b in\amd64\dumpbin.exe" /EXPORTS .\mdb.obj Microsoft (R) COFF/PE Dumper Version 11.00.50727.1 Copyright (C) Microsoft Corporation. All rights reserved.

Dump of file .\mdb.obj

File Type: ANONYMOUS OBJECT D:\Work\lightningdb-win\liblmdb\Release [master +10 ~5 -0 !]>

zdeslav
08/04/2013 03:21 PM by
zdeslav

are you building with /GL option? also, try /SYMBOLS instead of /EXPORTS.

Ayende Rahien
08/04/2013 03:29 PM by
Ayende Rahien

zdeslav, I am looking at you now with glazed eyes. No idea what you are talking about.

zdeslav
08/04/2013 03:42 PM by
zdeslav

sorry for succinctness, I was typing with child in my arms :)

i see that you call 'dumpbin /exports' but 'dumpbin /symbols' will list all the symbols, so you can check whether there is anything similar to mdbenvset_flags, or is it missing completely.

I ask about /GL flag, as it prevents using these flags.

Ayende Rahien
08/04/2013 03:47 PM by
Ayende Rahien

I removed /GL flag, and then used /symbols. The object has mdbenvsetflags in it.

zdeslav
08/04/2013 04:06 PM by
zdeslav

hmm, markdown is messing up the formatting and stripping underscores. I understand that the symbol name in the obj file starts with the underscore, like _mdb_env_set_flags, without any additions (like @12)? In that case it all seems fine. it's a long shot, but are you sure that set_mapsize is linked from the same obj file and not some other?

Keith
08/04/2013 09:04 PM by
Keith

those (env, ....)

I'm guessing they should be (&env, ....)

Ayende Rahien
08/04/2013 09:20 PM by
Ayende Rahien

Keith, No, that is already a pointer.

Keith
08/04/2013 09:23 PM by
Keith

what do the 3 warnings say?

Alois Kraus
08/04/2013 09:39 PM by
Alois Kraus

Maybe you have duplicate header files with different content? Check from where the header file is loaded for all projects. Could it be that set_flags does contain as input types ifdefed types which do change the actual signature? That would make it possible to compile it but fail at link time because the library was compiled with a differen set of ifdefs.

Kelly Sommers
08/05/2013 03:34 AM by
Kelly Sommers

Not enough details in this post to even suggest what the real problem is since I can't see what the project includes.

You need to have midl.h and midl.c in the project. Are they included?

Ayende Rahien
08/05/2013 04:13 AM by
Ayende Rahien

Kelly, That was mostly to vent. I work around that since I just needed to test something out. FWIW, this was in the lmdb-win project.

Jono
08/05/2013 09:50 AM by
Jono

The missing symbol is prefixed with a "_" unlike your usage?

Rodrigo Zechin
08/05/2013 12:31 PM by
Rodrigo Zechin

The fact that both functions are defined in the same header doesn't mean they are implemented in the same library.

You need to find out on which *.lib file this function is implemented and reference it during the linking phase. The easiest (but ugliest) way of doing this is with a #pragma comment(lib, “xxx.lib”) on your *.c file

The "right" way would be to add the lib to your "Additional Dependencies" list on the project properties

Comments have been closed on this topic.