문제

C ++ 프로그램을 만들고 있지만 사용자에게 .exe 파일 만 제공 할 수 있기를 원합니다. 그러나 DLL이있는 라이브러리 (컬)를 사용하고 있습니다. 이 dll을 .exe 파일로 컴파일 할 수 있습니까?

코드 :: 블록과 mingw를 사용합니다.

도움이 되었습니까?

해결책

이를 달성하려면 필요합니다 정적 연결. 이를 위해서는 모든 라이브러리 (및 재귀 적으로 의존하는 라이브러리)를 정적 라이브러리로 사용할 수 있어야합니다. 정적 라이브러리의 모든 코드를 전달하므로 실행 파일의 크기가 커질 것입니다. 이것이 바로 공유 라이브러리 (DLL)가 처음부터 발명되어 응용 프로그램간에 공통 코드를 공유 할 수있는 이유입니다. 그러나 그것이 항상 작동하는 것은 아닙니다 창에서 너무 잘.

나는 당신이 정말로 원하는 것이 An이라고 생각합니다 설치자 이로 인해 실행 파일과 종속 라이브러리가 모두 설치됩니다.

다른 팁

2002 년부터 DDJ에 당신이 원하는 것을 가질 수있는 기사가 있습니다.

기본적으로 MSVC의 '지연로드'기능을 사용하여 DLL에 링크하고 EXE의 임베디드 리소스로 DLL을 포장하는 것의 조합을 사용합니다. 그런 다음 DLL은 수출 중 하나에 대한 첫 번째 호출이 이루어질 때 런타임에 자동으로 추출됩니다.

나는이 기술을 사용하지 않았으므로 그것이 얼마나 잘 작동하는지에 대해 실제로 언급 할 수는 없지만 매끄러운 아이디어처럼 보입니다.

당신이 사용할 수있는 일 머지

나는 만났다 dll2lib 한 번 유틸리티. 흥미로운 작품이지만 비싸지 만. 이를 통해 거의 모든 DLL을 정적 라이브러리로 변환 할 수 있습니다.이 라이브러리로 나중에 응용 프로그램과 연결되어 솔리드 EXE를 생성 할 수 있습니다. IIRC, 무료 버전에는 생성 된 라이브러리에서 함수를 입력하면 특정 알림 (MessageBox)이 표시됩니다.

특수 패커 도구가 필요합니다 Xbundler.

실제로이 작업을 수행 해야하는 경우 메모리에서 DLL을로드 할 수있는이 멋진 라이브러리를 사용할 수 있습니다. 나는 그것을 자원에서 DLL을 읽고 나를 위해로드하는 데 사용했습니다.

https://github.com/fancycode/memorymodule

일반적으로 아니요. DLL은로드 할 때 로더 잠금을 획득하고 해당 지점에서 DLLMAIN을 호출하는 등 사소한 특수 행동을 가지고 있습니다. 이론적 링커는 각 dllmain이 응용 프로그램 main ()에서 호출되도록 배열 할 수 있지만로드 된 잠금 장치에서는 발생하지 않습니다. 이 로더 잠금 장치는 OS를 제어합니다. 또한 DLL은 DLLMAIN을 통해 새로운 스레드를 알리고, 이는 가짜가 거의 불가능할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top