C++ 프로그램이 출시되면 종속 라이브러리에는 솔루션이 없습니다.

Tip: 글 작성 후 자동으로 목차가 생성될 수 있으며, 생성 방법은 오른쪽 도움말 문서를 참고하시면 됩니다.


머리말

저자는 최근에 C++을 이용하여 pcl 라이브러리의 코드를 호출하고 코드를 C#에서 사용할 수 있도록 dll로 패키징하는 방법을 연구하고 있으며, 사용한 IDE는 VS2017이다. 많은 노력 끝에 마침내 포장이 성공적이었고 이 기계에 대한 테스트가 통과되었습니다. 하지만 다른 사람에게 dll을 배포하면 다음과 같은 오류가 발생합니다.
System.DllNotFoundException:“无法加载 DLL“PointCloudDll.dll”: 找不到指定的模块

여기에 이미지 설명 삽입
그러나 나는 분명히 모든 Dll을 exe의 동일한 디렉토리 아래에 두었습니다. 왜 이 오류가 계속 발생합니까?

1. 오류 분석

이 오류에는 일반적으로 세 가지 이유가 있습니다.
첫째, 패키징된 코드에 문제가 있고,
둘째, dll의 비트 수가 타겟 머신의
비트 수와 일치하지 않습니다.
이 머신에서 테스트 해보면 문제가 없으니 1번은 제외해도 되고, 본인이 패키징한 dll은 64비트이고 타겟머신도 64비트로 설정되어 있으니 2번은 제외해도 됩니다 . 그 문제는 세 번째 지점에서 발생합니다.
하지만 패키징할 때 다른 dll을 참조하지 않았습니다. 예, 우리는 다른 dll을 직접 사용하지 않았지만 컴퓨터가 관련 dll을 자동으로 참조했습니다. 이는 vs.dll 검색 경로와 관련이 있습니다. 일반적으로 vs의 dll 검색 순서는 다음과 같습니다
.

B. 시스템 디렉토리. GetSystemDirectory에서 반환되는 디렉터리는 일반적으로 시스템 디스크\Windows\System32입니다.

c. 16비트 시스템 디렉토리. 이 항목은 앞으로의 호환성 처리에만 사용되며 무시할 수 있습니다.

d. Windows 디렉토리. GetWindowsDirectory에서 반환되는 디렉터리는 일반적으로 시스템 디스크\Windows입니다.

e. 현재 디렉토리. GetCurrentDirectory에서 반환한 디렉터리입니다.

f. 환경 변수 PATH의 모든 디렉토리

여기서 시스템 디렉토리는 32비트 머신이든 64비트 머신이든 일반적으로 Windows\System32입니다. 어떤 사람들은 SysWOW64 디렉토리가 있지 않습니까? 64비트 시스템이 이 디렉토리 아래에 있어야 하지 않습니까? WOW64는 Windows on Wondows의 약자로 32비트 프로그램과 호환되도록 존재합니다. 64비트 운영 체제에서는 32비트 코드와 64비트 코드가 별도로 실행되며 System32와 SysWOW64라는 두 개의 라이브러리 폴더와 두 개의 레지스트리가 있습니다. 일반적으로 32비트 시스템의 규칙에 따르면 64비트 dll을 저장하는 폴더는 System64라고 해야 하지만 사실 Microsoft는 호환성을 유지하기 위해 여전히 64비트 dll을 System32 폴더에 저장하고 있으며 동시에 32비트와 호환되도록 SysWOW64 폴더를 설정합니다.
이를 이해했다면 오류가 보고된 이유를 이해해야 합니다. 제가 직접 패키징한 dll이 pcl 라이브러리 코드를 많이 사용하고, 이런 관련 dll을 디렉토리에 넣지 않았기 때문입니다. 그러나 로컬 컴퓨터에서 실행하면 오류가 없습니다. 이는 이 머신에 pcl 라이브러리의 환경 변수를 설정해두었기 때문에 캡슐화된 dll이 호출되면 dll이 pcl dll을 사용하게 되는데, 이 dll들을 디렉토리에 넣지는 않았지만 vs는 환경 변수를 넘길 수 있다. 이러한 관련 dll을 찾으면 오류가 보고되지 않습니다.

둘, 해결책

이제 관련 dll이 부족하여 문제가 발생했음을 알았으므로 가장 먼저 할 일은 누락된 dll을 찾는 것입니다.여기서 dll 분석 도구를 사용하여 자신의 패키지에서도 참조되는 dll을 분석해야 합니다. 여기서 우리는 스테이션 B를 추천합니다 분석 도구 메인 Hell8999에서 작성한 PE 분석기, 이것은 다운로드 링크입니다
이 도구를 통해 내가 직접 패키징 한 dll이 다른 많은 dll을 참조한다는 것을 분석 할 수 있습니다
여기에 이미지 설명 삽입

그 중 빨간색 화살표는 pcl 관련 dll을, 초록색 화살표는 윈도우 시스템의 dll을 가리키며 일반적으로 일반 윈도우에는 이러한 dll이 있을 것이고, 파란색은 C++ 런타임의 dll이다. 여기에서는 pcl의 dll을 디렉토리에 넣기만 하면 됩니다. 다른 dll은 대부분의 컴퓨터에서 사용할 수 있습니다. 이 두 개의 pcl dll이 pcl_io_ply_release 및 OpenNI2 두 개의 dll을 참조하는 pcl_io_release dll과 같은 다른 dll을 포함할 수 있기 때문에 이것만으로는 충분하지 않습니다. 작성자가 이 두 dll을 넣지 않아서 원인을 찾는데 꼬박 하루가 걸렸습니다.
따라서 타사 라이브러리로 dll을 캡슐화할 때 각 dll의 종속성을 확인해야 하며, 하나의 dll이 누락되어 프로그램에서 오류를 보고할 수 있습니다.
여기에 이미지 설명 삽입

요약하다

타사 라이브러리를 사용하여 dll을 배포할 때 dll이 함께 의존하는 다른 dll을 배포해야 하며 다른 dll도 다른 dll을 참조할 수 있다는 점을 잊지 마십시오. 중첩 인형처럼 레이어별로 중첩됩니다. 몇 개의 레이어가 설정되어 있든 배포 시 모든 dll이 함께 배포되어야 합니다!

추천

출처blog.csdn.net/bookshu6/article/details/125052874