2011-02-08 9 views
1

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

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

が、私はそれが記載されている私の共有ライブラリモジュールによって生成されたDLLを持っている必要があり期待し、しかし:リンカコマンドはNARプラグインによって吐き出す

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

は次のようになりますそれはない。 DLLのNARは実行可能ファイルのターゲットディレクトリに展開されます。

Windows用NARプラグインを設定する際の助けに感謝します。代わりに、リンカーを正しく実行する方法を示すコマンドラインが便利なので、NAR設定をバックフィルして達成することができます。ありがとう。

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

Calculator.h

#ifndef CALCULATOR_H 
#define CALCULATOR_H 

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

#endif 

Calculator.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> 

答えて

2

自分の質問に答えます。

私の同僚は、彼の脳の暗いくぼみを掘り起こし、「dicklespeck」のようなものが必要であることを思い起こさせました。それは奇妙に聞こえたので、私はそれを「他のすべてが失敗したら私はそれを見上げる」バケットに入れました。他のすべてが失敗した後、私はそれに戻ってきて、彼が正しいことを明らかにしたさまざまなスペルをグーグルで調べました。この嫌いをクラス宣言に追加すると:

__declspec(dllexport) 

DLLは実行ファイルと正常にリンクします。だから、

のような電卓ヘッダファイルを "固定" そうソリューションです:

#ifndef CALCULATOR_H 
#define CALCULATOR_H 

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

#endif 

ウエッは!私は#defineそれは離れて、Windows以外のビルドのために離れていることができますが、まだまだ!

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

+0

これは、エクスポートするアイテムをマークする必要があるウィンドウで一般的です。輸出と輸入のバリエーションがあります(静的リンケージでもどちらでもありません)ので、ここで合理的なスタートです。http://stackoverflow.com/questions/4983835/export-dlls-classes-and-functions-and-import-them-into- win32-application –

+0

他のオプションは、/ export:__ function \ _to \ _export__をリンカフラグに追加することです。個人的には素敵な定義を使用し、gccの可視性を利用してリンカが内部シンボルを処理するのにあまり時間を費やさないようにすることさえできます。 http://gcc.gnu.org/wiki/Visibilityを参照してください。 – KitsuneYMG

関連する問題