Den 2010-09-24 19:30 skrev Charles Wilson: > On 9/23/2010 6:25 PM, Peter Rosin wrote: >> I don't know how to set up the defines so that EXTERN becomes >> >> 1. "extern" when you use a static library >> 2. "extern" when you build a static library >> 3. "extern declspec(dllimport)" when you use a shared library >> 4. "extern declspec(dllexport)" when you build a shared library >> >> I could fix 2 and 4, but separating 1 and 3 is not possible. Since >> extern declspec(dllimport) works everywhere with MSVC I'm taking the >> easy option with this patch. >> >> Or should I add -DBUILDING_FOO to Makefile.am and variations of the below >> to the code? > > That is the typical approach. The drawback -- usually an acceptable one > -- is that if you are building a "stack" of dependent DLLs: > > EXE --> C.DLL -> B.DLL > --> A.DLL > > Then (a) you must link exe using .obj's compiled as pic (e.g. with > -DDLL_EXPORT, even tho the EXE *itself* is not a "shared library"). > libtool does this by default IIRC. (b) You MUST link EXE against shared > C.DLL and shared A.DLL; you can't link against static C.lib and B.lib, > but dynamic A.DLL, or vice versa (because DLL_EXPORT, for EXE's objs, > either IS, or IS NOT, defined).
Now I'm also confused. /me double checks (see below) WHAT? It doesn't work as I stated!?! *ponders that for a bit* *scratches head* Ahh, you said "libtool does this by default IIRC". If that's actually the case than that is what has have me fooled for years. *deep sigh* Thanks for setting me straight. What now? Is the patch still good? (with a reworded changelog of course) *thinks again* But now I'm really confused. What made the original patch work? It had "#define EXTERN extern __declspec(dllimport)" unconditionally for MSVC. And that patch also had two SKIPs and one FAIL (libfoo.a vs. foo.lib). I.e. the exact same result, which means I can't be completely wrong. Or is the testsuite not doing any static builds? But that seems highly unlikely indeed. WTF? Cheers, Peter $ echo "extern __declspec(dllexport) int variable; int variable = 0;" > dllfoo.c $ cl -nologo -Fefoo.dll -MD dllfoo.c -link -dll -export:variable -implib:foo.dll.lib dllfoo.c Creating library foo.dll.lib and object foo.dll.exp $ echo "extern __declspec(dllimport) int variable; int main(void) { return variable; }" > bar.c $ cl -nologo -Febar.exe -MD bar.c foo.dll.lib bar.c $ ./bar $ echo $? 0 $ echo "extern int variable; int variable = 0;" > libfoo.c $ cl -nologo -c -MD libfoo.c libfoo.c $ lib -nologo -out:foo.lib libfoo.obj $ cl -nologo -Febar.exe -MD bar.c foo.lib bar.c bar.obj : error LNK2019: unresolved external symbol __imp__variable referenced in function _main bar.exe : fatal error LNK1120: 1 unresolved externals