3

ヘッダーファイル名が重複している2つのライブラリを使用している状況があります。たとえばtimer.h、両方のライブラリに存在します。#include <dir1/timer.h>これに対する通常の解決策は、include likeまたはでディレクトリを明示的に指定し#include <dir2/timer.h>て、コンパイラが指定する手がかりを得るようにすることだと思います。ただし、私の問題は、使用しているライブラリの1つがプロジェクトのサブディレクトリにないことです。それはより高いレベルのどこかに存在します。あれは...

    • Library1
    • プロジェクト
      • ProjectFolder
        • Library2

これは、複数のプロジェクトがLibrary1を参照できるようにするために行われました。当時はいい考えのようでした。ただし、Library2の名前の競合が発生したため、問題が発生します。もう1つの重要な詳細は、2つの異なるワークステーションをよく使用することです。これらのワークステーション上のLibrary1の絶対位置は同じではなく、(プロジェクトフォルダーに対する)相対位置も2つの間で同じではありません。これまで私が行ってきたことは、プリプロセッサの検索パスに両方の絶対位置を追加することです。

とにかく、私はあなたが提供するかもしれないどんなガイダンスにも感謝します。

4

2 に答える 2

3

"dir1/timer.h"あなたはとで正しい軌道に乗ってい"dir2/timer.h"ます。dirしかし、それをと考えるのではなく、 と考えて"project1/timer.h"ください。Makefileでは、共通の場所にない場合は、検索パスに の場所をproject1追加する必要があります。include

どちらのコードにも相対パスを含めないでください (no ../file.h)。これらは、プロジェクトのベース ディレクトリ (#include <sys/socket.h>または など#include <linux/sched.h>) に対して相対的である必要があります。次に、それらを見つけるのはメイクファイル次第です (これらの 2 つの例は標準の検索パスにあるため、機能します)。あなたの場合は、できる-I<path to project directory>し、#include "other_project/library.h".

于 2012-10-31T00:08:11.903 に答える
2

プロジェクトに特定のバージョンの外部ライブラリのコピーを含め、必要に応じて新しいバージョンに更新することをお勧めします (ただし、実際にプロジェクトから外部ライブラリを変更することはありません)。誰もが使用している現在の (変化している) バージョンを参照するだけでは、コードを変更しなくても、プロジェクトの動作が変わる可能性があります。プロジェクトのリリースは、その時点で使用していたライブラリのバージョンを完全に参照する必要もあります。

そのようにした場合、そのアプローチを使用する場合、相対パスは常に同じです (たとえば、「../ExternalLib」)。または、デイブが提案するようにすることもできます。

于 2012-10-31T00:35:39.400 に答える