![런타임 시 프로그램에 따라 서로 다른(호환되지 않는) 라이브러리를 연결하는 방법은 무엇입니까?](https://linux55.com/image/26767/%EB%9F%B0%ED%83%80%EC%9E%84%20%EC%8B%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%97%90%20%EB%94%B0%EB%9D%BC%20%EC%84%9C%EB%A1%9C%20%EB%8B%A4%EB%A5%B8(%ED%98%B8%ED%99%98%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94)%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A5%BC%20%EC%97%B0%EA%B2%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
특정(종종 충돌하는) 라이브러리로 컴파일해야 하는 레거시 코드가 많이 있습니다. 구체적으로 말하면, 로만 컴파일할 수 있는 프로그램 g77
과 로만 사용할 수 있는 프로그램이 있습니다 gfortran
.
첫 번째 프로그램을 호출해보자마케이그리고 두 번째 프로그램UVES_popler.
컴파일(및 실행)할 때 모두 연결되어야 합니다.그림이는 해당 컴파일러로 컴파일됩니다. 그래서, 컴파일마케이g77로 실행해야지그림g77
이것도 정리되었습니다. 그리고 각각 똑같다UVES_popler그리고 gfortran
.
g77 및 gfortran을 사용하여 pgplot을 컴파일할 수 있다고 가정하면 bashrc를 구성하는 모범 사례는 무엇입니까? 각 프로그램에 대해 bash 기능을 만들고 올바른 링크와 LD_LIBRARY_PATH
s를 가져야 합니까? 그것은 다음과 같습니다:
runmakee() {
export LD_LIBRARY_PATH=/path/to/g77-pgplot/
makee
}
그리고 (아마도 관련이 있을 수 있지만) 이러한 프로그램이 별도로 컴파일될 때 올바른 라이브러리가 호출되도록 Makefile에 플래그를 설정하는 방법이 있습니까?
답변1
Bash 기능은 작동해야 하지만 "일반적인" 접근 방식은 각 실행 파일에 대한 래퍼 스크립트를 작성하고 그 안에 설정해야 하는 모든 항목을 설정하는 것입니다. (예를 들어 실행 파일 이름을 변경 foo.bin
하고 더 쉽게 호출하기 위해 래퍼 스크립트를 호출할 수 있습니다 foo
.)
ELF 대상의 경우(다른 개체 형식은 확실하지 않음) -rpath
링커 옵션을 설정하여 실행 파일에서 런타임 라이브러리 검색 경로를 직접 하드코딩할 수도 있습니다. gcc(C 코드용)를 사용하면 최종 연결 단계는 다음과 같습니다.
gcc ... -Wl,-rpath,/your/hardcoded/path ...
Fortran 컴파일러에도 비슷한 옵션이 있거나 링커 옵션을 직접 변경할 수 있다고 가정합니다(이 경우 옵션은 -rpath /your/path
).