为什么用nar-maven编译静态库时要加编译器选项/MD?
Why is compiler option /MD added when compiling static library with nar-maven?
当设置 library.type
为 static
和 运行 mvn -X clean compile
时,DEBUG 输出显示:
[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'
...
包括 /MD
恕我直言,此处不应出现。这同样适用于编译 test.link
设置为 static
的测试可执行文件和编译 test.link
设置为 shared
的源文件。我唯一会使用 /MD
的情况是编译链接到共享库的可执行文件时。
即使 maven 生成一个静态库并且测试 运行 没有错误,在代码中设置 _DLL
定义混淆了我的 __declspec(dllexport/dllimport)
编译共享库的宏并且是在静态情况下根本不需要。
任何人都可以提示我是我在监督某事还是这可能是插件错误?
示例取自com.github.maven-nar
网站的it0010-lib-static
示例并对其进行修改,并将pom文件剥离到最小值:
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>
/MD 和 /MT 编译器标志由我监督的 <runtime/>
属性 控制,它指定生成的工件对动态 C 运行时库 (CRT) 的依赖性
虽然针对(运行时 | library.type)属性 对的不同组合生成的库和测试可执行文件的 很明显:
(static | static) : 使用 /MT,静态库、测试和库没有 CRT dep
(静态 | 共享):/MT 使用,dyn lib、test 和 lib 没有 CRT dep,测试在 dll 上有 rt dep
(dynamic | static): /MD used, static lib, test 和 lib 有 CRT dep
(动态 | 共享):/MD 使用,dyn lib,test 和 lib 有 CRT dep,test 有 rt dep on dll
备注:
- 测试可执行文件的 link.type 必须始终与 library.type
相同
- Ability to build a shared library and tests using different runtime is still an open issue
当设置 library.type
为 static
和 运行 mvn -X clean compile
时,DEBUG 输出显示:
[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'
...
包括 /MD
恕我直言,此处不应出现。这同样适用于编译 test.link
设置为 static
的测试可执行文件和编译 test.link
设置为 shared
的源文件。我唯一会使用 /MD
的情况是编译链接到共享库的可执行文件时。
即使 maven 生成一个静态库并且测试 运行 没有错误,在代码中设置 _DLL
定义混淆了我的 __declspec(dllexport/dllimport)
编译共享库的宏并且是在静态情况下根本不需要。
任何人都可以提示我是我在监督某事还是这可能是插件错误?
示例取自com.github.maven-nar
网站的it0010-lib-static
示例并对其进行修改,并将pom文件剥离到最小值:
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>
/MD 和 /MT 编译器标志由我监督的 <runtime/>
属性 控制,它指定生成的工件对动态 C 运行时库 (CRT) 的依赖性
虽然针对(运行时 | library.type)属性 对的不同组合生成的库和测试可执行文件的
(static | static) : 使用 /MT,静态库、测试和库没有 CRT dep
(静态 | 共享):/MT 使用,dyn lib、test 和 lib 没有 CRT dep,测试在 dll 上有 rt dep
(dynamic | static): /MD used, static lib, test 和 lib 有 CRT dep
(动态 | 共享):/MD 使用,dyn lib,test 和 lib 有 CRT dep,test 有 rt dep on dll
备注:
- 测试可执行文件的 link.type 必须始终与 library.type 相同
- Ability to build a shared library and tests using different runtime is still an open issue