2011-11-22 1 views
2

gtkmm, gtkglextmm 및 exiv2를 사용하는 프로그램이 있습니다.Linux의 .dll과 같은 것 - 가져 오는 방법은 무엇입니까?

사용자가 시스템에없는 경우 앱이 작동하지 않기 때문에 이러한 라이브러리를 실행 파일에 포함하고 싶습니다. Windows .dll 파일에서 문제를 해결했습니다 (출력 파일과 동일한 디렉토리에 파일을 넣었습니다).

Linux에서 비슷한 라이브러리를 연결하는 방법은 무엇입니까? 거기에 도움이되는 도구가 있습니까? 나는 사용자가 의존성을 설치하도록 강요 할 수 없다.

+2

Linux에서는 .dll과 동일한 기능이 "동적 공유 객체"입니다. 또는 .so. 실행 파일에서 필요한 라이브러리를 정적으로 링크 할 수는 있지만 이는 실제로 최선의 방법은 아닙니다. David Heffernan의 대답을보십시오. 종속성을 사용자가 강제로 설치할 필요는 없습니다. 사용자가 자신이 선택한 것임을 알리고 그러한 종속성없이 응용 프로그램을 실행할 수 없습니다. –

+0

프로그램이 자유 소프트웨어 (예 : GPL 또는 LGPL 라이센스) 인 경우 주요 배포판에 패키지를 제공하는 데 도움이됩니다 (때로는 좋은 사람이 패키지로 제공하기도합니다). –

+0

윌리엄 나는 어딘가에 gtk (와 gtkmm)와 정적 연결을 할 수 없다는 것을 읽었다. 나는 그것이 사실인지 궁금하다 ... 또한 David Heffernan의 대답 아래에 적어 둔 것처럼, 사용자가 의존성을 설치하기에는 너무 게으른 경우에도이 프로그램을 작동시켜야한다. – Marco

답변

4

더 나은 방법은 타겟팅 할 배포본 [s]의 패키지 시스템을 사용하는 것입니다. (자신이 dpkg를 사용 aptitude 또는 apt-get와) 데비안/우분투/민트에 .deb 포장 레드햇/페도라, 얌은/RPM, 등 등

DLL-들 ELF에 (리눅스 shared libraries ( *.so라는 이름의 파일)이라고

형식을 사용하려면 objdump, nm ... 그들을 탐색하고 그들을 빌드 gcc -fPIC -shared). 프로그래밍 방식으로로드 할 수 있습니다 dlopen & dlsym. DLL 사이의 중요한 차이점이 있음을 염두에 두십시오. & Linux * .so (dynamic linking은 Windows에서 동일한 의미가 없습니다.

0

당신은 당신의 프로그램을 시작하는 간단한 쉬 스크립트를 작성할 수 있습니다

#!/bin/sh 
LD_LIBRARY_PATH=/path/to/intall/directory 
path/to/your/exe 

넣어 때문에 도서관에/경로/리눅스/인스톨 한후에/디렉토리

+1

종속성 문제를 해결하지 못합니다 (배포판에 따라 세부 사항이 다름). 그렇게하지 않는 것이 좋습니다. –

+0

왜? glibc와 같은 기본적인 것들의 ABI는 X11 프로토콜과 같이 거의 바뀌지 않았습니다. 따라서 앱에 다른 "그래서"라이브러리가 있으면 문제없이 실행할 수 있습니다. 이제 qt 4.6과 같은 것을 사용할 때 상황을 상상해보십시오. 응용 프로그램이 사용자에게 어떻게 보이는지 보여줄 필요가 있습니다. 그러나 사용자는 고대 데비안 기계 만 가지고 있습니다. 어떻게하면 모든 시스템을 업데이트하여 응용 프로그램을 한 번 실행합니까? – fghj

+0

예, Qt가 너무 많은 의존성을 가지고있어 수동으로 해결할 가치가 없기 때문입니다. 필요하다면, chroot-ed 환경에서 "새로운"시스템을 실행하십시오. 그러나 고대 커널과 최근의 libc에서는 작동하지 않을 것입니다. –

10

표준 연습을하려면 의존성을 재배포 할 수 없습니다. 이렇게하면 방금 많은 양의 복제가 생성됩니다. 대신 설치 패키지에 종속성을 지정하고 패키지 관리자가이를 해결하도록해야합니다.

+0

글쎄, 내 프로그램이 리눅스에서 작동해야하고, 누군가가 의존성을 설치하는 게 게으름이다. 나는 이것이 Windows에서 dll과 같이 수행되도록하는 데 필요한 표준적인 방법을 알고 있습니다. – Marco

+4

이것은 Windows가 아닙니다. 원하는 패키지 관리자로 패키지를 설치하는 것은 간단합니다. 그것은 단순히 그것을하는 방법입니다. 플랫폼과 싸우지 마십시오. –

관련 문제