2008-09-20 2 views
33

Linux/GCC에서 -rpath 플래그를 사용하여 환경 변수로 템퍼링하지 않고 공유 라이브러리의 실행 파일 검색 경로를 변경할 수 있습니다.-rpath 링커 플래그와 동일한 Windows/MSVC가 있습니까?

Windows에서도이 작업을 수행 할 수 있습니까? 내가 아는 한 dll은 항상 실행 파일의 디렉토리와 PATH에서 검색됩니다.

내 시나리오 : 고유 한 이름을 돌보지 않고 공유 라이브러리를 속성 (32/64bit/Debug/Release)에 따라 위치에 배치하고 싶습니다. 리눅스에서 이것은 rpath를 통해 쉽게 할 수 있지만, 아직 Windows에서이 방법을 찾지 못했습니다.

어떤 힌트를 주셔서 감사합니다!

답변

4

Windows에서 DLL의 검색 순서는 MSDN의 this page에 설명되어 있습니다. run-time dynamic linking을 사용하는 경우 LoadLibrary에 전화 할 때 폴더를 지정할 수 있습니다.

3

"Isolated applications"은 DLL 종속성을 설명하는 XML 매니페스트를 포함하기위한 메커니즘입니다.

+0

이 메커니즘은 어셈블리에만 해당됩니다. 이것은 관리 코드에 속합니다. – Christian

+0

참고 자료가 있으십니까? 이 주제와 관련하여 본 모든 내용은 네이티브 코드 DLL을 동일하게 허용하는 것으로 보입니다. –

+0

어셈블리는 [Wikipedia] (https://en.wikipedia.org/wiki/.NET_assembly)에 정의되어 있습니다. MSDN은 어셈블리라는 용어를 MSI [어셈블리] (http://msdn.microsoft.com/en-us/library/aa367757%28v=vs.85%29.aspx)와 함께 사용해야합니다. 따라서 귀하가 참조한 기사는 설치된 응용 프로그램에 속합니다. rpath 정보는 응용 프로그램에 임베드되어 설치시 릴레이되지 않습니다. Rpath는 링크 직후에 효과적입니다. – Christian

16

슬프게도 RPATH와 직접적인 유사점이 없습니다. 각기 다른 방법으로 당신에게 바람직하지 않은 가능성이 있습니다.

런타임 라이브러리 충돌을 피하기 위해 각 빌드 맛을 위해 다른 exe가 필요하다고 가정 할 때 가장 쉬운 방법은 각 exe를 각 DLL 세트와 동일한 폴더에 넣는 것입니다.

앞서 언급했듯이 가장 보편적 인 방법은 배치 파일을 사용하여 exe를 부트 스트랩하여 PATH 변수를 변경하는 것입니다.

대신 원하는 DLL 폴더로 프로그램을 실행하기 전에 현재 작업 디렉토리를 변경할 수 있습니다.

exe ​​안에 SetDllDirectory 또는 AddDllDirectory 함수를 사용할 수 있습니다. 아마도 RPATH에 가장 근접하지만 WinXP SP1 이상에서만 작동합니다.

각 exe flavor의 파일 이름을 변경하려는 경우 "App Paths"레지스트리 키를 사용할 수 있습니다. 각 exe는 고유 한 파일 이름이 필요합니다.