Я упаковал уже скомпилированную версию OpenCV в проект NAR Maven. Я следовал https://github.com/CERN/narlibs-log4cplus чтобы достичь этого (проект, который содержит только файлы .lib, .dll и .h). Это моя последняя структура каталогов ( lib
каталог содержит файлы .lib и .dll и каталог include
содержит файлы .h):
pom.xml
файл:
...
<groupId>org.opencv</groupId>
<artifactId>opencv-nar</artifactId>
<packaging>nar</packaging>
<version>2.4.10</version>
<build>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.0.0</version>
<extensions>true</extensions>
<configuration>
<libraries>
<library>
<type>static</type>
</library>
<library>
<type>shared</type>
</library>
</libraries>
</configuration>
</plugin>
</plugins>
</build>
Я использую эту зависимость от простого проекта:
#include "opencv2/highgui/highgui.hpp"int main(int argc, char *argv[]) {
cv::waitKey(0);
return 0;
}
Проблема происходит в фазе соединения (после выполнения mvn compile -X
).
...
[DEBUG] FileSet: Setup scanner in dir E:\PROY\image-lib\dev\1.0\image\target\nar\opencv-nar-2.4.10-x86-Windows-msvc-shared\lib\x86-Windows-msvc\shared with patternSet{ includes: [opencv-nar-2.4.10.lib] excludes: [] }
...
[DEBUG] Execute:Java13CommandLauncher: Executing 'link' with arguments:
'/MANIFEST'
'/NOLOGO'
'/SUBSYSTEM:CONSOLE'
'/INCREMENTAL:NO'
'/OUT:image.exe'
'C:\image\target\nar\obj\x86-Windows-msvc\image-test.obj'
[INFO] image-test.obj : error LNK2019: unresolved external symbol "int __cdecl cv::waitKey(int)" (?waitKey@cv@@YAHH@Z) referenced in function _main
[ERROR] image-test.obj : error LNK2019: unresolved external symbol "int __cdecl cv::waitKey(int)" (?waitKey@cv@@YAHH@Z) referenced in function _main
[INFO] image.exe : fatal error LNK1120: 1 unresolved externals
[ERROR] image.exe : fatal error LNK1120: 1 unresolved externals
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
Я вижу, что проблема в том, что ни одна из статических библиотек из OpenCv не передается аргументам ‘link’. Так, Как добавить статическую библиотеку (или лучше каталог) в link
аргументы?
opencv_core2410.lib
opencv_imgproc2410.lib
opencv_highgui2410.lib
Это не ответ, а скорее обходной путь. Я верю, что, кстати, MAVEN NAR разработан (даже сам MAVEN) каждый Библиотека должна быть на своем собственном проекте.
Итак, имея это в виду, вам нужно создать проект, основанный на этих двух проектах:
Итак, для моего проекта OpenCV, это родитель pom.xml
, который основан на родительский pom.xml из библиотек Boost C ++ в виде maven, для список имен компиляторов для плагина NAR смотрите в aol.properties:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.opencv</groupId>
<artifactId>parent</artifactId>
<version>2.4.10</version>
<packaging>pom</packaging>
<name>OpenCV :: Parent</name>
<description>OpenCV</description>
<properties>
<nar-plugin.version>3.2.3</nar-plugin.version>
<compiler-name>msvc</compiler-name>
<linker-name>msvc</linker-name>
</properties>
<modules>
<module>core</module>
<module>highgui</module>
<module>imgproc</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>${nar-plugin.version}</version>
<extensions>true</extensions>
<configuration>
<cpp>
<name>${compiler-name}</name>
<includes>
<include>**/*.hpp</include>
<include>**/*.h</include>
<include>**/*.cpp</include>
<include>**/*.c</include>
</includes>
</cpp>
<linker>
<name>${linker-name}</name>
</linker>
<libraries>
<library>
<type>static</type>
</library>
<library>
<type>shared</type>
</library>
</libraries>
</configuration>
</plugin>
</plugins>
</build>
</project>
И каждый модуль имеет pom.xml
файл, который более или менее похож на это:
<?xml version = '1.0'?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.opencv</groupId>
<artifactId>parent</artifactId>
<version>2.4.10</version>
</parent>
<artifactId>opencv-core</artifactId>
<packaging>nar</packaging>
<name>OpenCV :: Core</name>
<description>OpenCV</description>
<build>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>
Теперь вам нужно добавить соответствующие зависимости в ваш проект pom.xml
:
<dependencies>
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv-core</artifactId>
<version>2.4.10</version>
<type>nar</type>
</dependency>
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv-highgui</artifactId>
<version>2.4.10</version>
<type>nar</type>
</dependency>
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv-imgproc</artifactId>
<version>2.4.10</version>
<type>nar</type>
</dependency>
</dependencies>
И там у вас есть:
> mvn compile
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
Других решений пока нет …