使用 CMake 和 Maven 构建C++和 Java 代码,并捆绑在一个罐子里
Building C++ and Java code using CMake and Maven and bundle in a jar
我有使用 CMake 构建的遗留C++代码。它会生成一个.so
文件。我需要将此代码包装在 Java 中,并构建一个包含 Java 代码以及部署C++的jar
。
使用 CMake 构建C++代码的步骤很简单:
cd /to/pkg/dir
cmake .
make
.so
文件在build/
目录下生成。如果我将整个项目转换为 maven,我将不得不修改目录结构(这里有一篇博客文章解释了它是如何工作的:http://blog.bigpixel.ro/2012/07/building-cc-applications-with-maven/(。但是,我不想那样做。是否可以选择从 maven 调用上面显示的前两行来构建.so
文件,然后将其包含在最终jar
中?
在Apache Hadoop中,构建会执行类似于您所描述的操作。 我们在编译阶段使用 Apache Maven AntRun 插件对cmake
进行外部调用,然后在 CMake 生成的构建输出上调用make
来编译和链接代码库的 C 部分。 然后,此输出将馈送到我们的最终构建工件中。 在我们的例子中,这些构建工件是压缩包,而不是直接捆绑到jar文件中,但你可以通过控制Apache Maven JAR插件的配置来完成它。 具体而言,您可能需要覆盖内容包含/排除设置。
如果你想把它作为一个起点,Hadoop构建的相关部分在这里可见:
https://github.com/apache/hadoop/blob/release-2.7.3-RC2/hadoop-common-project/hadoop-common/pom.xml#L598-L615
<execution>
<id>make</id>
<phase>compile</phase>
<goals><goal>run</goal></goals>
<configuration>
<target>
<exec executable="cmake" dir="${project.build.directory}/native" failonerror="true">
<arg line="${basedir}/src/ -DGENERATED_JAVAH=${project.build.directory}/native/javah -DJVM_ARCH_DATA_MODEL=${sun.arch.data.model} -DREQUIRE_BZIP2=${require.bzip2} -DREQUIRE_SNAPPY=${require.snappy} -DCUSTOM_SNAPPY_PREFIX=${snappy.prefix} -DCUSTOM_SNAPPY_LIB=${snappy.lib} -DCUSTOM_SNAPPY_INCLUDE=${snappy.include} -DREQUIRE_OPENSSL=${require.openssl} -DCUSTOM_OPENSSL_PREFIX=${openssl.prefix} -DCUSTOM_OPENSSL_LIB=${openssl.lib} -DCUSTOM_OPENSSL_INCLUDE=${openssl.include} -DEXTRA_LIBHADOOP_RPATH=${extra.libhadoop.rpath}"/>
</exec>
<exec executable="make" dir="${project.build.directory}/native" failonerror="true">
<arg line="VERBOSE=1"/>
</exec>
<!-- The second make is a workaround for HADOOP-9215. It can
be removed when version 2.6 of cmake is no longer supported . -->
<exec executable="make" dir="${project.build.directory}/native" failonerror="true"></exec>
</target>
</configuration>
</execution>
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '