避免使用MINGW编译器和NAR-Maven-Plugin避免使用机器依赖的POM
Avoiding machine-dependent POM with MinGW compiler and nar-maven-plugin
我有一个简单的基于JNI的项目,可以尝试使用nar-maven-plugin
。我正在运行Windows 10,并且正在使用MINGW编译器。我将本机代码编译为C 而不是C,尽管我认为这对这个问题不重要。("真实"项目中的本机实现将使用C ,因此,一旦我超越了此初始测试,就不会将其更改并不是微不足道的。(
为了通过Eclipse IDE使用maven install
进行此构建,我需要在POM文件中明确指定链接器,作为插件configuration
的一部分。相关部分在这里:
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<linker>
<name>g++</name>
<options>
<option>-Wl,--kill-at</option>
</options>
</linker>
<libraries>
<library>
<type>jni</type>
<narSystemPackage>com.mycompany.sandbox</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
如果我这样做,那么我在本地机器上很好,但是我相信我将POM专门用于某些机器/链接器。如果我完全将其取出,那么我会收到此错误:
[INFO] --- nar-maven-plugin:3.5.1:nar-validate (default-nar-validate) @ nar-test ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.786 s
[INFO] Finished at: 2017-06-29T17:05:34-04:00
[INFO] Final Memory: 8M/23M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.github.maven-nar:nar-maven-plugin:3.5.1:nar-validate (default-nar-validate) on project nar-test: Execution default-nar-validate of goal com.github.maven-nar:nar-maven-plugin:3.5.1:nar-validate failed. NullPointerException -> [Help 1]
如果我离开<name>g++</name>
零件并仅删除选项,则它会编译,但我的测试失败了,因为它无法在运行时链接到本机实现。(这与--kill-at
标志和已知问题有关,所以这并不令人惊讶。(
是否有一种已知的方法来处理此问题,以使我得到与机器无关的POM?
这是构建配置文件的典型用例:
但是,有时便携性不是完全可能的。[...]在其他时候,您甚至可能需要根据检测到的构建环境包含整个插件。
因此,将不同的插件配置放入配置文件中,并在构建时相应地激活它们。
一种替代方法是使用以下属性:
<option>${options}</option>
在以下值中定义的值:
mvn ... -Doptions=-Wl,--kill-at
Gerold Broser的答案似乎与我想要的相反,但这确实使我走上了使用配置文件的正确道路。对我来说,诀窍之一是意识到可以在配置文件中对单个插件进行部分规范,同时将同一插件的其他参数放在主build
部分中。尽管在这种情况下不需要,因为我不需要在默认情况下指定任何不同的内容,但我也得出结论,我想在默认设置上使用activeByDefault
,而不是建议使用activeProfiles
。
有关完整性,工作pom的相关部分如下:
<profiles>
<!-- This default not needed since is specifies nothing, but this seems to be the correct syntax if it were needed
<profile>
<id>Default-CPP-Tools</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
-->
<profile>
<id>Windows-MinGW</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<build>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<linker>
<name>g++</name>
<options>
<option>-Wl,--kill-at</option>
</options>
</linker>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<defaultGoal>integration-test</defaultGoal>
<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>jni</type>
<narSystemPackage>com.mycompany.sandbox</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
</plugins>
</build>
- 如何从C++中的依赖类型中获得它所依赖的类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- C++GTKMM gui循环依赖关系
- 通过ccmake在cmake中缓存依赖选项
- 64位机器上的C++内存对齐
- 使用不同的链接器会产生不同的机器代码吗
- 当基类是依赖类型时,这是一个缺陷吗
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 从不同的附加依赖项中识别等同命名的函数
- 如何在 CMake 中对目标依赖项进行分组?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- 避免使用MINGW编译器和NAR-Maven-Plugin避免使用机器依赖的POM
- 如果C++依赖于机器,那么用C++编写的软件如何在不同的计算机上工作
- 依赖于机器架构意味着什么