web-dev-qa-db-ja.com

サードパーティのコードをCまたはC ++プロジェクトに追加する正しい方法は何ですか?

いくつかのオープンソースライブラリをCプロジェクトに組み込みたいです。私がこれを行うのはこれが初めてなので、それを行うための正しいまたは最も一般的な方法が何であるかわかりません。

私が取ることができる2つの可能なパスが表示されます。

  1. 使用する各ライブラリのコードをダウンロードし、プロジェクトフォルダーに追加して、必要に応じて変更します。
  2. 各ライブラリを依存関係としてリストするだけです。したがって、ユーザーはそれらをそのマシンにダウンロードし、いくつかのメイクファイル構成を使用してプロジェクトにインクルードします(たぶん)。

オプション#1は2つの理由でより良いと思います:

  1. 依存関係のダウンロードと構成のタスクからユーザーを解放します。
  2. 私のプロジェクトでは、2つのライブラリに重複するコードがあります。 1つのライブラリの一部は、他のライブラリのサブセットです。それらは同じ機能と同じ識別子名(変数、関数、#defines)を持っています。だから私は修正する方法がわからないいくつかの競合があるでしょう。

しかし、私はちょうど考えるオプション#1の方が優れています。何が一番いいのか本当にわかりません。たぶん、誰かがライブラリ間の競合を修正する方法を知っていて、私の意見が変わるかもしれません。私がこの質問をしているのは、プログラマが通常取る道がわからないためです。また、各代替案の長所と短所が何であるかもわかりません。また、他に選択肢があるかどうかもわかりません。

pdate:想定されるユーザーはプログラマーです。

7
user300750

@ 17of26は、#2が危険である理由、および#1がより理にかなっている理由を数多く示しました。ただし、不足していることが1つあると思います。そのため、次のことをお勧めします。

  • 使用するライブラリのコードをダウンロードし、
  • それをプロジェクトフォルダに追加し、
  • しかし任意に変更しないでください !!

可能な場合は変更を避けてください。それが不可能な場合は、直接の変更を最小限に抑え、他のすべてを個別のファイルに保存してください。必要に応じて、スクリプトファイルまたはパッチファイルを使用します。そのため、libsまたはmakefile構成に対するすべての変更が文書化され、再現できることを確認してください。

これにより、必要に応じて、後でこれらのライブラリの新しいバージョンに更新する機会が増えます。

もちろん、libのバージョン1.0に適用されたパッチまたは構成の変更が、そのlibのバージョン2.0にも直接適用できるという保証はありません。しかし、パッチ/変更の数が少ない場合、可能性ははるかに高くなり、それらを適用するための労力はおそらく少なくなります。

9
Doc Brown

プロジェクトとの依存関係は常にパッケージ化する必要があります。

ソフトウェアは、特定のライブラリの特定のバージョンでビルドおよびテストされます。他のバージョンでの動作は保証されていません。

その正確なバージョンのライブラリをコードに同梱する必要があります。そうでなければ、あなたはサポートの悪夢への扉を開いています。

たとえば、ライブラリFoo v1.0を使用してコードをビルドおよびテストするとします。製品にFoo v1.0を同梱せず、代わりに「ユーザー様、このライブラリFoo v1.0を入手してください」と言います。

想像してみてください:

  • Fooはインターネットから消えます。多分それは廃業した会社によってホストされています。あるいは、Foo v1.0の開発者が怒っているユーザーからの電子メールにうんざりして、ライブラリへのパブリックアクセスを削除したのかもしれません。
  • Fooは非常に積極的に開発されています。 Fooはv8.0になりました。 Foo開発者はv7.0より古いもののサポートを停止することを決定し、以前のバージョンへのアクセスを削除します。
  • Foo開発者はv1.0に重大な変更を加えますが、実際にはバージョンを増分しません。ユーザーがv1.0をダウンロードすると、使用していたライブラリとは異なるライブラリが取得され、機能しなくなります。

ソフトウェアが動作するために必要な正確なバイナリを出荷することにより、これらの潜在的な頭痛のすべてを回避します。

5
17 of 26

サードパーティのコードを管理する一般的な方法は、「ベンダーブランチ」を使用することです(私は、git、svnなどのバージョン管理システムを使用していると思います)。

ベンダーブランチを使用すると、サードパーティのコードへの変更を追跡し、それらの変更をコードに簡単に組み込むことができます。また、それらの変更を処理するためにコードに加える必要がある変更も簡単に組み込むことができます。

ベンダーブランチの主題は複雑すぎてここに入ることができません(詳細は使用しているvcによって異なります)が、Webには多くの便利なガイドがあります。

1
Dipstick