为啥使用nar-maven编译静态库时添加编译器选项/MD?

Posted

技术标签:

【中文标题】为啥使用nar-maven编译静态库时添加编译器选项/MD?【英文标题】:Why is compiler option /MD added when compiling static library with nar-maven?为什么使用nar-maven编译静态库时添加编译器选项/MD? 【发布时间】:2017-02-02 13:29:57 【问题描述】:

library.type 设置为static 并运行mvn -X clean compile 时,DEBUG 输出显示:

[DEBUG] 执行:Java13CommandLauncher:使用参数执行 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl': '' '/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>

【问题讨论】:

【参考方案1】:

/MD 和 /MT 编译器标志由我正在监督的 &lt;runtime/&gt; 属性控制,它指定生成的工件对动态 C 运行时库 (CRT) 的依赖性

虽然为 (runtime | library.type) 属性对的不同组合生成的 lib 和测试可执行文件的 checking the runtime type dependencies 很明显:

(static | static) : /MT used, static lib, test 和 lib 没有 CRT dep (静态 | 共享):使用 /MT,dyn lib、test 和 lib 没有 CRT dep,test 在 dll 上有 rt dep (动态|静态):使用/MD,静态库,测试和库有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

【讨论】:

以上是关于为啥使用nar-maven编译静态库时添加编译器选项/MD?的主要内容,如果未能解决你的问题,请参考以下文章

编译skia静态库时,图片解码库无法注册的问题

qt creator qt5.1 vs2010 使用静态库时链接器错误

怎样添加预编译静态库 libwebrtc

linux编译动态库时,libcrypto.a 提示recompile with -fPIC

linux 静态库和动态库编译的区别

为啥“WinMain”在链接为 *.a 静态库时无法解析?