When setting library.type
to static
, and running mvn -X clean compile
, the DEBUG output shows:
[DEBUG] Execute:Java13CommandLauncher: Executing 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl' with arguments:
''
'/c'
'/nologo'
'/EHsc'
'/DNDEBUG'
'/MD'
'/GR'
...
including /MD
which IMHO should not be present here. The same holds for compiling a test executable with test.link
set to static
and for compiling source files with test.link
set to shared
. The only case I would use /MD
is when compiling an executable linked to shared libraries.
Even though maven produces a static library and the test is running without errors, setting the _DLL
define inside the code mixes up my __declspec(dllexport/dllimport)
macro for compiling shared libraries and is not necessary at all in the static case.
Can anybody give me a hint whether I'm overseeing something or this might be a plugin bug?
The example is taken and modified from the it0010-lib-static
example from the com.github.maven-nar
web site and the pom file stripped to the minimum:
pom.xml:
<build>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<libraries>
<library>
<type>static</type>
</library>
</libraries>
<linker>
<name>msvc</name>
</linker>
<tests>
<test>
<name>HelloWorldTest</name>
<link>static</link>
</test>
</tests>
</configuration>
</plugin>
</plugins>
</build>
The /MD and /MT compiler flags are controlled by the <runtime/>
property which I was overseeing and which specifies the dependency of the produced artifacts on the dynamic C runtime libraries (CRTs)
While checking the runtime type dependencies of the produced lib and test executable for the different combinations of the (runtime | library.type) property pairs it became clear that:
(static | static) : /MT used, static lib, test and lib have no CRT dep
(static | shared) : /MT used, dyn lib, test and lib have no CRT dep, test has rt dep on dll
(dynamic | static): /MD used, static lib, test and lib have CRT dep
(dynamic | shared): /MD used, dyn lib, test and lib have CRT dep, test has rt dep on dll
Remarks: