2014-04-30 1 views
0

저는 CMake를 사용하여 연구 코드를 개발하여 Ubuntu 시스템에서 C++ 코드의 Makefile을 생성했습니다. 필자는 컴퓨터에서 설정하고 빌드하는 데 관련된 몇 가지 공유 라이브러리에 연결합니다. 특히 하나는 빌드하기가 쉽지 않은 특정 버전의 종속성이 있습니다. 일부는 라이브러리의 사용자 정의 빌드입니다 (버그 수정).CMake 종속 공유 라이브러리가있는 Ubuntu에서 RedHat EL6 용 독립 실행 파일을 빌드하십시오.

CLR을 사용하는 Windows 환경에 익숙하지만 바이너리를 빌드하고 모든 공유 라이브러리를 함께 포함시켜야합니다. 다행스럽게도 다른 환경의 링커 (redhat EL6)는 런타임에 이러한 공유 객체를 사용할 수 있기를 바랍니다.

링커가 응용 프로그램 경로를 조사하지 않기 때문에 공유 라이브러리를 찾기 위해 사용자 특정 라이브러리 경로로 가져와야한다고 가정합니다.

Cmake (아마도 Cpack)를 사용하여 바이너리를 빌드하고 다른 머신을 위해 공유 된 모든 오브젝트를 '패키지'하는 좋은 방법이 있습니까? 그럼 (수동으로하더라도) 내 사용자에 대해서만 공유 라이브러리를 설치하고 바이너리를 실행할 수 있습니다.

정적 라이브러리를 사용하지 않는 것이 좋을 것 같습니다. 과거에는 이러한 종속성에 많은 문제가있었습니다.

나는 리눅스 멍청한 놈, 그래서 내 문제가 더 나은 방법을 이해의 부족에 있다면 나는 모든 귀 :

+1

프로젝트의 일부, 또는와 충돌 할 수 공유 라이브러리의 표준이 아닌 버전입니다 이러한 공유 라이브러리 위치 :

여기에 완성도 연결된 유사하지만 동일하지 않은 문제에 대해 이야기 내 이전 답이다 설치된 라이브러리? –

+0

은 대부분 boost와 같은 공통 패키지의 공유 라이브러리이지만, 특히 프로젝트의 dev 브랜치 (fenics-project)에 대한 커스터마이징 빌드입니다. 소스에서 프로젝트를 빌드하는 것은 종속성을 추적하고 트리니너와 같은 빌드에 악몽입니다. 목적지가 공유 환경이기 때문에 그 경로를 피하고 싶습니다. Redhat EL6으로 VM을 설정하고 거기에 빌드해야 할 필요가 있다고 생각합니다. 그런 다음 공유 라이브러리를 내 사용자 경로 (수동)에 복사하십시오. – ccook

답변

2

한 가지 방법이 몇 가지 추가를 하드 코드 이진의 "RPATH"를 설정하는 것입니다 검색 경로. $ ORIGIN으로 설정하면 바이너리와 동일한 디렉토리에있는 라이브러리가 먼저 사용됩니다.

IF(UNIX) 
    SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH}:\$ORIGIN/../bin:\$ORIGIN") 
ENDIF() 

이 CMake 코드는 시간 (make install)를 설치에 적용됩니다, 그래서 일단 당신은 당신의 CMake 설치의 INSTALL 명령을 설정해야합니다. INSTALL 바이너리와 모든 추가 공유 객체. 마지막으로 CPack은 내부적으로 "설치"를 실행하므로 make install이 작동하면 CPack을 사용하여 TGZ를 구축하거나 RPM을 설정하여 설정 시간을 투자 할 수 있습니다. https://stackoverflow.com/a/22209962/1401351

+0

고마워요, 제가 지금 읽고 있어요 :) – ccook