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

我的问题如下:

  1. 我可以假设在包含共享对象的 Nexus 存储库中提供的 omniORB4 NAR 依赖项包含错误的 .so 名称吗?
  2. 在 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>

libsName

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 中构建一个自定义属性文件。