1

Maven NAR プラグインを使用して、非常に単純な C++ プログラムを構築しようとしています。共有ライブラリを構築するための Maven モジュールと、ライブラリにリンクしてそれを使用する実行可能ファイルを構築するための別の Maven モジュールをセットアップしました。Mac でのビルドはうまく機能し、プログラムを実行できます。残念ながら、Windows (XP) で MS Visual C++ (無料版) を使用してビルドすると、リンカー エラーが発生して失敗します。2 つのマシンの構成 (OS とコンパイラ以外) の唯一の違いは、Windows マシンで Maven を使用してビルドする前に vcvars32.bat を実行することです。これが私が得ているエラーです:

main.obj : error LNK2019: unresolved external symbol "public: int __thiscall 
Calculator::add(int,int)" (?add@Calculator@@QAEHHH@Z) referenced in function
_main executable.exe : fatal error LNK1120: 1 unresolved externals

NAR プラグインによって吐き出されるリンカー コマンドは次のようになります。

link /MANIFEST /NOLOGO /SUBSYSTEM:CONSOLE /INCREMENTAL:NO /OUT:executable.exe
C:\dev\Projects\trunk\executable\target\nar\obj\x86-Windows-msvc\main.obj

共有ライブラリ モジュールによって生成された DLL がリストされているはずですが、そこにはありません。DLL の NAR は、実行可能ファイルのターゲット ディレクトリに解凍されます。

Windows 用の NAR プラグインを構成する際のヘルプをいただければ幸いです。または、リンカーを適切に実行する方法を示すコマンド ラインが役立つので、NAR 構成をバックフィルしてそれを実現できます。ありがとう。

私の共有ライブラリ モジュール:

電卓.h

#ifndef CALCULATOR_H
#define CALCULATOR_H

class Calculator {
public:
    int add(int first, int second);
};

#endif

電卓.cc

#include "Calculator.h"

int Calculator::add(int first, int second) {
    return first + second;
}

pom.xml (スニペット):

<groupId>com.mycompany</groupId>
<artifactId>library</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>nar</packaging>

...

<plugin>
    <artifactId>maven-nar-plugin</artifactId>
    <version>2.1-SNAPSHOT</version>
    <extensions>true</extensions>
    <configuration>
        <libraries>
            <library>
                <type>shared</type>
            </library>
        </libraries>
    </configuration>
</plugin>

私の実行可能モジュール:

main.cc

#include <iostream>
#include "Calculator.h"

int main() {
    Calculator calculator;
    std::cout << calculator.add(2, 5) << std::endl;
}

pom.xml (スニペット)

<groupId>com.mycompany</groupId>
<artifactId>executable</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>nar</packaging>

<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>library</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <type>nar</type>
</dependency>

...

<plugin>
    <artifactId>maven-nar-plugin</artifactId>
    <version>2.1-SNAPSHOT</version>
    <extensions>true</extensions>
    <configuration>
        <libraries>
            <library>
                <type>executable</type>
            </library>
        </libraries>
    </configuration>
</plugin>
4

1 に答える 1

2

私自身の質問に答えます。

私の同僚は、彼の脳の暗いくぼみを掘り下げて、「ディックルスペック」のようなものが必要だったことを思い出したと言いました. それは奇妙に聞こえたので、「他のすべてが失敗した場合はそれを調べます」バケットに入れました. 他のすべてが失敗した後、私はそれに戻って、さまざまなスペルをグーグルで検索し、彼が正しいことを明らかにしました. この嫌悪感をクラス宣言に追加すると、次のようになります。

__declspec(dllexport)

DLL は実行可能ファイルと正常にリンクします。

したがって、Calculator ヘッダー ファイルを次のように「修正」することが解決策です。

#ifndef CALCULATOR_H
#define CALCULATOR_H

class __declspec(dllexport) Calculator {
public:
    int add(int first, int second);
};

#endif

うん!Windows以外のビルドではそれを取り除くことができます#defineが、それでも-うん!

これが唯一の解決策ではないことを誰か教えてください。

于 2011-02-08T23:53:11.790 に答える