プロジェクトがシンボリックリンクを使用してコンパイルされないのはなぜですか?

プロジェクトがシンボリックリンクを使用してコンパイルされないのはなぜですか?

私はC ++(ROS)プロジェクトを開発するチームで働いています。

何らかの理由で私たちは良い子管理をしません。

私たちはいくつかのgitブランチを持っています。プロジェクトをコンパイルするには、git clone各ブランチからコードを取得してディレクトリ構造を並べ替える必要があります。

mkdir -p /home/me/repoまずそれを行い、git clone各ブランチからコードを取得し、すべて/home/me/repo

これで構造を並べ替える必要があります。私がしたことは次のとおりです。

#!/bin/sh

mkdir -p /home/me/project/src
cd /home/me/project/src
catkin_init_workspace   # command of ROS to initialize a workspace

cp -r /home/me/repo/robot_dev/control .
cp -r /home/me/repo/robot_dev/control_algo .
cp -r /home/me/repo/sim/third_party .
cp -r /home/me/repo/planning .
cp -r /home/me/repo/robot_dev/cognition/hdmap .

cd ..
catkin_make    # command of ROS to compile the project

プロジェクトをコンパイルするためにこのようなスクリプトを作成して動作します。ご覧のとおり、いくつかのディレクトリをコピーして再配置してコンパイルしました。

cp -r今は時間がかかりすぎるので良い考えではないと思います。私はln -s同じことをしたい。だから私は次のように別のスクリプトを書いた。

#!/bin/sh

mkdir -p /home/me/project2/src
cd /home/me/project2/src
catkin_init_workspace   # command of ROS to initialize a workspace

ln -s /home/me/repo/robot_dev/control control
ln -s /home/me/repo/robot_dev/control_algo control_algo
ln -s /home/me/repo/sim/third_party third_party
ln -s /home/me/repo/planning planning
ln -s /home/me/repo/robot_dev/cognition/hdmap hdmap

cd ..
catkin_make    # command of ROS to compile the project

ただし、エラーが発生します。

CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkin_package.cmake:297 (message):
  catkin_package() absolute include dir
  '/home/me/project2/src/hdmap/../third_party/ubuntu1604/opencv-3.3.1/include'

確認してcd /home/me/project2/src/hdmap/../third_party/ubuntu1604/opencv-3.3.1/includeみると存在します。

cp -rコンパイルするのにコンパイルできない理由はありますかln -s

答え1

..シンボリックリンクの場合、アクセスは実際に期待どおりに機能しません。

Bashでこれを試してみると、Bashは「助け」を試して問題を解決しようとするので、問題は明確になりません。

しかし、簡単に言うと、に移動すると、/home/me/project2/src/hdmap/../third_partyカーネルは最初に「hdmap」へのシンボリックリンクを確認し、に達してから親ディレクトリを/home/me/repo/robot_dev/cognition/hdmap探します。..それhdmapディレクトリなので、/home/me/repo/robot_dev/cognitionそこでthird_partyを見つけようとします。

存在しない場合/home/me/repo/robot_dev/cognition/third_party(または存在する場合は必要なものと異なる場合/home/me/repo/sim/third_party)、ファイルが見つかりませんエラーが発生します。

Bashは$PWD変数を保持し、パスを文字列として保存するので、パスを..カーネルに渡す前にシェル自体で参照を「解決」するのに役立ちます。これにより、これらの詳細が非表示になります。

bashで(or)を使用してset -Pこの動作を無効にすることができます。set -o physical(詳細はbashのマニュアルページを参照してください。)


基本的な問題を解決するのに役立ちます...おそらく良い解決策はcp -rlコピーツリーを使用することです。ハードリンクを生成する-lオプションcp。この場合は問題になりません。これは、特にファイルが変更されたくないと仮定するためです。それでもデータ構造を繰り返し、各オブジェクトを個別に作成する必要がありますが、何も生成する必要はありません。

最新のファイルシステム(Btrfsなど)を使用している場合は、cp -r --reflinkCoW(記録中にコピー)レプリカを作成してみることもできます。本質的にハードリンクですが、2つの名前の間に接続がないため、少し優れています。彼らは単にバックエンドでブロックを共有し、ファイルの1つをタッチすると、実際には2つの別々のファイルに分岐します。 (しかし、ハードリンクだけで十分だろうと思います。)

おそらくgitでいくつかのトリックを実行して、各ステップで必要なディレクトリを公開できます。これにより、実際に必要な部分を複製できます。しかし、これは達成したり保守するのが難しいかもしれませんcp -rl

関連情報