프로젝트가 심볼릭 링크를 사용하여 컴파일되지 않는 이유는 무엇입니까?

프로젝트가 심볼릭 링크를 사용하여 컴파일되지 않는 이유는 무엇입니까?

저는 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(기록 중 복사) 복제본을 생성해 볼 수도 있습니다. 본질적으로 하드 링크이지만 두 이름 사이에 연결이 없기 때문에 약간 더 좋습니다. 그들은 단지 백엔드에서 블록을 공유하고 파일 중 하나를 터치하면 실제로 두 개의 별도 파일로 분기됩니다. (하지만 하드 링크만으로도 충분할 것 같아요.)

아마도 git으로 몇 가지 트릭을 수행하여 각 단계에서 필요한 디렉토리를 노출할 수 있습니다. 그러면 실제로 필요한 부분을 복제할 수 있습니다. 하지만 이는 달성하거나 유지 관리하기가 더 어려울 수 있습니다.. cp -rl바라건대 충분히 말했습니다!

관련 정보