Hey all,

I'm currently using D for a hook-based project that requires me to build both a 32bit and 64bit DLL. Naturally, the 32bit DLL builds fine, however I'm encountering linking issues for the 64bit. I followed the instructions at http://wiki.dlang.org/Installing_DMD_on_64-bit_Windows_7_(COFF-compatible) for setting up 64bit building (albeit I didn't use his environment variables - I just put the paths into sc.ini directly), so if there's a problem with my setup, I don't see it.

Here is my build output (I'm using Xamarin Studio with Mono-D, if that means anything):

---------------------------------------------------------------------------

Building: HookLib (Debug|x64)

Performing main compilation...

Current dictionary: C:\Development\Projects\EyefinityMaximizer\HookLib

dmd.exe -debug -gc "main.d" "C:\Development\Projects\EyefinityMaximizer\EyefinityMaximizer\eyemax\WinAPI.d" "HookLib.def" "user32.lib" "-IC:\Development\Compilers\D\dmd2\src\phobos" "-IC:\Development\Compilers\D\dmd2\src\druntime\src" "-L/IMPLIB:C:\Development\Projects\EyefinityMaximizer\bin\Debug\HookLib.x64.lib" "-odobj\Debug" "-ofC:\Development\Projects\EyefinityMaximizer\bin\Debug\HookLib.x64.dll" -m64

HookLib.def(1) : warning LNK4017: EXETYPE statement not supported for the target platform; ignored

HookLib.def(2) : warning LNK4017: SUBSYSTEM statement not supported for the target platform; ignored

HookLib.x64.obj : warning LNK4197: export 'CallWndProc' specified multiple times; using first specification

Creating library C:\Development\Projects\EyefinityMaximizer\bin\Debug\HookLib.x64.lib and object C:\Development\Projects\EyefinityMaximizer\bin\Debug\HookLib.x64.exp

phobos64.lib(dmain2_4ac_1a5.obj) : error LNK2019: unresolved external symbol _Dmain referenced in function main

C:\Development\Projects\EyefinityMaximizer\bin\Debug\HookLib.x64.dll : fatal error LNK1120: 1 unresolved externals

--- errorlevel 1120

Exit code 1120

Build complete -- 1 error, 0 warnings

---------------------------------------------------------------------------

As you can see, there appears to be an issue with my usage of WinMain() as opposed to just main(). For 32bit building, the documentation states that the compiler recognizes WinMain and works accordingly - is this also the case for 64bit building?

Here is my WinMain function, in case I'm doing something wrong with it:

---------------------------------------------------------------------------

extern(Windows) int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) {
        int result;
        void exceptionHandler(Throwable e) { throw e; }

        // Init the D runtime
        try {
                Runtime.initialize(&exceptionHandler);
result = myWinMain(hInstance, hPrevInstance, lpCmdLine, iCmdShow);
                Runtime.terminate(&exceptionHandler);
        } catch (Throwable e) {
MessageBoxA(null, e.toString().toStringz, "Error", MB_OK | MB_ICONEXCLAMATION);
                result = 0;
        }
        
        return result;
}

---------------------------------------------------------------------------

Any assistance would be appreciated, as this project is stalled until I can build 64bit binaries.

Thanks and regards,
Trey

Reply via email to