2016-05-09 17 views
-1

他のプログラムのC++で書かれた共有ライブラリを使用しようとしています。私は共有ライブラリを行って、それが動作することをテストしました。C++でヘッダーファイルのない構造体と関数をリンクする

上記共有ライブラリは、他のライブラリに依存しています。私はこの問題を避けて、共有ライブラリをコンパイルしてリンカにその依存関係を見つける場所を教え、すべての依存関係を持つ共有ライブラリをフォルダに展開しました。

問題

私の問題はヘッダーファイルです。共有ライブラリで展開するヘッダーファイルがありますが、このヘッダーファイルにはサードパーティのヘッダーも含まれています。たとえば、私の共有ライブラリAとそのヘッダファイルAHがあります。 AHは、の定義を得るためにBHCHのヘッダーファイルを含める必要があります。これは避けたいものです

次に、解決策は、私が必要とするサードパーティの機能にexternキーワードを使用することだと思います。この問題は、structs(上記のサードパーティのヘッダファイルで宣言されている)の定義も必要であることです。したがって、externキーワードを使用してこの構造体定義を含めるにはどうすればよいですか?私がしたいことをするための良い方法はありますか?

+0

ライブラリのユーザーはサードパーティの宣言について知っている必要がありますか?第三者タイプの価値を返すことはありますか? –

+0

両方の質問には該当しません。 – Dan

+2

サードパーティのタイプを内部的に使用しているのであれば、pimplを使用することができます。 –

答えて

2

私は私の共有ライブラリ

なぜで展開するヘッダファイルがありますか?ヘッダーはコンパイル時にのみ必要です。ライブラリと一緒にヘッダーを提供する必要がない場合は、それを使用するプログラムを実行する必要があります。

しかし、おそらく、あなたのライブラリを使用する追加のプログラムを作成したいと思うかもしれません。

でも、このヘッダファイルにはサードパーティのヘッダも含まれています。たとえば、私の共有ライブラリAとそのヘッダファイルAHがあります。 AHは、の定義を得るためにBHCHのヘッダーファイルを含める必要があります。これは避けたいものです

あなたはあまり意味がありません。代替手段を提供

  1. BHCHが利用可能であることを確認、または
  2. 、互換性のあるバージョン:AHは定義が必要な場合は、あなたが唯一の2つのオプションがありBHCHが提供する(または多分あなたは本当に宣言を意味します) AHが必要とする定義/宣言。

関数の宣言が必要であることを記述します。もしあなたがAHでBとCの関数を呼び出すのであれば、フルの関数の宣言が必要です。関数の宣言はデフォルトでexternなので、心配はありませんが、完全なプロトタイプを持つことが不可欠です。あなたが望むのであれば、BHCHからそれらをコピーすることができますが、それはちょっと疑わしいです。

また、structの宣言が必要であると説明しています。型宣言にはリンケージがないため、externはそれらとは無関係です。 externは、グローバル変数について話している場合にのみここで重要です。これらの構造体のインスタンスへの不透明なポインタのみを使用する場合は、structsの完全な宣言は必要ありません。これは決してそれらを直接インスタンス化することを意味しません。それらのメソッドを呼び出すことさえできません。サイズやレイアウトによっては決して何もしません。あなたの用法場合 - あなた自身のヘッダファイルAHに含めが - これらの要件を満たしている場合、代わりに問題の構造体の完全な宣言のあなた自身、不完全なものを提供することができます:もちろん

struct b_struct; 

を、以来、ライブラリへのポインタがライブラリBとCの関数によって提供され、独自のコードが格納されているものと何も関係がなく、それらを関数またはメソッドとして渡すだけでは、ポインタへのポインタで直接行うことはできません議論それ以上の容量が必要な場合は、完全な宣言が必要です。関数と同様に、それらをコピーすることができます。機能を持つ以上に、それは疑わしいです。より一般的に

、あなたはどのように私はexternキーワードを使用して[...]定義を含めることができ

を尋ねますか?

externリンケージであることを理解することが不可欠です。これは主に、関数、メソッド、および変数の実行時の可視​​性に関係しています。コンパイラとリンカがリンケージ規則を実装しているため、コンパイル時の可視性に関するものです。 externキーワードをstruct型の宣言に叩いても、その型の実際の宣言が含まれていないコードには、その型が魔法のように見えることはありません。

関連する問題