Maven NAR 插件:错误的链接库名称
Maven NAR plugin: wrong linked library name
我第一次使用 maven nar 插件在 C++ 中编译 corba IDL 文件。我已经使用 exec 插件和 omniidl 成功生成了存根和骨架,现在我在 src/ 下拥有所有 *.C 和 *.H 文件。
我们正在使用内部 Nexus 存储库来检索 NAR 依赖项,到目前为止我设法编译了所有 *.o 文件。但是,linker 失败并显示以下消息:
[INFO] 21 files were compiled.
[INFO] 21 files were compiled.
[INFO] Linking...
[INFO] Linking...
[INFO] Starting link {4.8 -shared -L/home/dev/repos/idl/cpp-idl/bin/nar/omniORB4-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lomniORB4-4.2.0-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/omnithread-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lomnithread-4.2.0-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/c-2.19-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lc-2.19-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/m-2.19-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lm-2.19-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/stdc__plus__plus-4.8.3+r212056-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lstdc__plus__plus-4.8.3+r212056-R1 -fexceptions -lstdc++}
[INFO] Starting link {4.8 -shared -L/home/dev/repos/idl/cpp-idl/bin/nar/omniORB4-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lomniORB4-4.2.0-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/omnithread-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lomnithread-4.2.0-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/c-2.19-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lc-2.19-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/m-2.19-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lm-2.19-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/stdc__plus__plus-4.8.3+r212056-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lstdc__plus__plus-4.8.3+r212056-R1 -fexceptions -lstdc++}
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lomniORB4-4.2.0-R1
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lomnithread-4.2.0-R1
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lc-2.19-R1
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lm-2.19-R1
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lstdc__plus__plus-4.8.3+r212056-R1
[ERROR] collect2: error: ld returned 1 exit status
例如文件夹
/home/dev/repos/idl/cpp-idl/bin/nar/omniORB4-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared
包含以下共享对象:
libomniORB4.so libomniORB4.so.2 libomniORB4.so.2.0
并且 linker 尝试 link 反对包含完整版本(依赖版本)的库名称
-lomniORB4-4.2.0-R1
我的问题如下:
- 我可以假设在包含共享对象的 Nexus 存储库中提供的 omniORB4 NAR 依赖项包含错误的 .so 名称吗?
- 在 linker 部分,有没有办法通过告诉 NAR 插件使用不同的库名称来 link 来解决这个问题?
这是配置 NAR 插件的 pom 部分:
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<configuration>
<libraries>
<library>
<type>shared</type>
</library>
</libraries>
<cpp>
<name>g++</name>
<sourceDirectory>${project.basedir}/src</sourceDirectory>
<options>
<option>-g</option>
</options>
<includes>
<include>**/*.C</include>
</includes>
<includePaths>
<includePath>${project.basedir}/src</includePath>
</includePaths>
</cpp>
</configuration>
</plugin>
....
谢谢。
错误出现在格式错误的依赖项 NAR 内容中。
在您的依赖项中使用 libsName
配置选项 pom.xml:
<configuration>
<libsName>omniORB4</libsName>
...
</configuration>
This tag is use to list multiple libs to be included into the linker.
This is really usefull when packaging 3rd party libraries.
Use the CSV notation: lib1,lib2
有两种方法可以将第三方库打包成NAR。
重命名库以匹配 NAR 约定
首先是重命名库以匹配插件的约定。如果要使用插件来构建库,这些约定与使用的命名相匹配。此打包的示例作为 github 项目中的集成测试之一提供。参见:Integration-test it0020
提供自定义 nar.properties
构建 NAR 时,插件通常会生成一个 nar.properties
文件,其中包含一些目前不完整的文档 NAR Dependencies。发布第三方 NAR 时,可以提供一个自定义属性文件来覆盖特定 AOL 的库名称。 属性 是:
<aol>.output=<space separated list of library names>
例如:
amd-Linux-gpp.output=fooapi foobasic
会导致此体系结构的 linux link 行包含 -lfooapi
和 -lfoobasic
.
生成的构建中的其他属性应该被复制过来,例如库绑定的类型和 nars 是如何link编辑的。
一些文档说无法覆盖此文件,但遵循资源的正常 Maven 约定允许替换它。在项目中的 src/main/resources/META-INF/nar/<groupId>/<artifact-name>
中放置一个 nar.properties
文件将在库 nar 中构建一个自定义属性文件。
我第一次使用 maven nar 插件在 C++ 中编译 corba IDL 文件。我已经使用 exec 插件和 omniidl 成功生成了存根和骨架,现在我在 src/ 下拥有所有 *.C 和 *.H 文件。
我们正在使用内部 Nexus 存储库来检索 NAR 依赖项,到目前为止我设法编译了所有 *.o 文件。但是,linker 失败并显示以下消息:
[INFO] 21 files were compiled.
[INFO] 21 files were compiled.
[INFO] Linking...
[INFO] Linking...
[INFO] Starting link {4.8 -shared -L/home/dev/repos/idl/cpp-idl/bin/nar/omniORB4-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lomniORB4-4.2.0-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/omnithread-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lomnithread-4.2.0-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/c-2.19-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lc-2.19-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/m-2.19-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lm-2.19-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/stdc__plus__plus-4.8.3+r212056-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lstdc__plus__plus-4.8.3+r212056-R1 -fexceptions -lstdc++}
[INFO] Starting link {4.8 -shared -L/home/dev/repos/idl/cpp-idl/bin/nar/omniORB4-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lomniORB4-4.2.0-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/omnithread-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lomnithread-4.2.0-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/c-2.19-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lc-2.19-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/m-2.19-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lm-2.19-R1 -L/home/dev/repos/idl/cpp-idl/bin/nar/stdc__plus__plus-4.8.3+r212056-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared -lstdc__plus__plus-4.8.3+r212056-R1 -fexceptions -lstdc++}
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lomniORB4-4.2.0-R1
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lomnithread-4.2.0-R1
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lc-2.19-R1
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lm-2.19-R1
[ERROR] /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lstdc__plus__plus-4.8.3+r212056-R1
[ERROR] collect2: error: ld returned 1 exit status
例如文件夹
/home/dev/repos/idl/cpp-idl/bin/nar/omniORB4-4.2.0-R1-amd64-Linux-gpp-shared/lib/amd64-Linux-gpp/shared
包含以下共享对象:
libomniORB4.so libomniORB4.so.2 libomniORB4.so.2.0
并且 linker 尝试 link 反对包含完整版本(依赖版本)的库名称
-lomniORB4-4.2.0-R1
我的问题如下:
- 我可以假设在包含共享对象的 Nexus 存储库中提供的 omniORB4 NAR 依赖项包含错误的 .so 名称吗?
- 在 linker 部分,有没有办法通过告诉 NAR 插件使用不同的库名称来 link 来解决这个问题?
这是配置 NAR 插件的 pom 部分:
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<configuration>
<libraries>
<library>
<type>shared</type>
</library>
</libraries>
<cpp>
<name>g++</name>
<sourceDirectory>${project.basedir}/src</sourceDirectory>
<options>
<option>-g</option>
</options>
<includes>
<include>**/*.C</include>
</includes>
<includePaths>
<includePath>${project.basedir}/src</includePath>
</includePaths>
</cpp>
</configuration>
</plugin>
....
谢谢。
错误出现在格式错误的依赖项 NAR 内容中。
在您的依赖项中使用 libsName
配置选项 pom.xml:
<configuration>
<libsName>omniORB4</libsName>
...
</configuration>
This tag is use to list multiple libs to be included into the linker. This is really usefull when packaging 3rd party libraries.
Use the CSV notation: lib1,lib2
有两种方法可以将第三方库打包成NAR。
重命名库以匹配 NAR 约定
首先是重命名库以匹配插件的约定。如果要使用插件来构建库,这些约定与使用的命名相匹配。此打包的示例作为 github 项目中的集成测试之一提供。参见:Integration-test it0020
提供自定义 nar.properties
构建 NAR 时,插件通常会生成一个 nar.properties
文件,其中包含一些目前不完整的文档 NAR Dependencies。发布第三方 NAR 时,可以提供一个自定义属性文件来覆盖特定 AOL 的库名称。 属性 是:
<aol>.output=<space separated list of library names>
例如:
amd-Linux-gpp.output=fooapi foobasic
会导致此体系结构的 linux link 行包含 -lfooapi
和 -lfoobasic
.
生成的构建中的其他属性应该被复制过来,例如库绑定的类型和 nars 是如何link编辑的。
一些文档说无法覆盖此文件,但遵循资源的正常 Maven 约定允许替换它。在项目中的 src/main/resources/META-INF/nar/<groupId>/<artifact-name>
中放置一个 nar.properties
文件将在库 nar 中构建一个自定义属性文件。