# New Ticket Created by Mark Glines # Please include the string: [perl #44855] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44855 >
t/src/compiler.t fails on msvc/win32 because the linker can't find the PMCNULL variable. Apparently this symbol is exported by the dll properly, but not imported by the embedded application properly. The background: 11:19 <@Ron> The story goes like this. 11:19 <@Ron> When building a DLL you need to tell the compiler to export the symbol. 11:20 <@Ron> This is done by __declspec(dllexport). 11:20 <@Ron> When using the DLL you need to tell the compiler to import it, with __declspec(dllimport). 11:21 <@Ron> This is done in include/parrot/config.h, but tied to #define PARROT_IN_EXTENSION. 11:22 <@Ron> Which makes sense, because it was mostly relevant for the extensions, which are separate shared objects, linked against libparrot. The problem: Embedded applications (such as those compiled by t/src/compiler.t) do not get the __declspec(dllimport) tag defined properly, and thus, do not import symbols from the dll correctly. This prevents third party applications from embedding parrot, by linking against libparrot. The proposed solution: 11:46 <@Ron> Infinoid, how about this. 11:46 <@Ron> in config.h, PARROT_API uses dllimport by default. 11:46 <@Ron> only uses dllexport if PARROT_EXPORTS is defined. 11:47 <@Ron> When compiling the sources that belong to libparrot.lib we'd need to define PARROT_EXPORTS. 11:48 <@Infinoid> will that be a headerfile define, or passed on the compiler command-line? 11:48 <@Ron> I think passed on the command line. The tests in t/src/compiler.t are skipped so it'll pass today's 0.4.15 release, but should be unskipped for testing whether this issue is resolved. Mark