2009-12-03 5 views
5

저는 정말 모호한 문제가 있습니다.하지만 누군가 도와 줄 수 있기를 바랍니다. 나는 C++ 프로젝트를 수정하고 있었고 어제는 여전히 작동했지만 오늘은 그렇지 않습니다. 나는 아무것도 바꾸지 않았지만 SVN에서 프로젝트를 다시 확인하고 이전 시스템 복원 지점으로 되돌리기까지했습니다 (이것은 업무용 컴퓨터이기 때문에 비밀리에 업데이트 등을 설치합니다.). 성공적으로 컴파일 한 후에는 프로그램을 시작할 수 있지만이 프로그램과 상호 작용하면이 오류가 발생합니다. 프로 시저 엔트리 포인트? methodName @ className @@ UAEXXZ를 동적 링크 라이브러리 libName.dll에서 찾을 수 없습니다.확실히 "넣을 때"프로 시저 엔트리 포인트를 dll에 둘 수없는 이유는 무엇입니까? "

인터넷을 검색했지만 대부분의 사람들의 문제는 사용중인 DLL의 이전 버전 때문에 발생하는 것으로 보입니다. 내 컴퓨터를 검색했는데 이전 버전이 없습니다. 올바른 버전을 삭제하면 응용 프로그램이 시작되지 않습니다. 그런 다음 프로젝트를 다시 컴파일하면 DLL이 다시 만들어 지므로 응용 프로그램이 올바른 DLL을 사용하고 있고 컴파일에서 생성 중이라는 것을 확신합니다. 오류가 참조하는 메서드에 구문 오류를 도입하면 프로젝트가 컴파일을 거부하므로이 메서드가 포함 된 파일도 컴파일 중임을 의미합니다.

기본적으로 저는 DLL의 연결에 대해 전혀 몰라요. 그래서 프로젝트에서 매우 명확하게 정의 된 기능이 왜 갑자기 나타나지 않는지에 대한 아이디어가 있다면 크게 감사하겠습니다. DLL에 더 이상 넣지 마십시오. 나는 이것이 모호하고 더 많은 정보가 필요하다면 기꺼이 그것을 제공 할 것이다. 감사!

업데이트 : 나는 주어진 제안을 시도했지만 여전히 붙어 있습니다. __declspec(dllexport)은 분명히 전체 프로젝트에서 사용되지 않습니다. Dependency Walker로 DLL을 열면 비어있는 오른쪽 상단 섹션이 표시되고 아래 섹션에는 오류 메시지의 기능이 나열됩니다. 내가 Undecorate C++ 기능을 선택하면 그것을 잘 보이는,하지만 난 그렇게하지 않으면 나는 오류 메시지에서 이상한 물음표와 @s을 얻고 마지막에 차이가있을 나타납니다 : 아마도

[email protected]@@UAEXXZ 
[email protected]@@[email protected] 

이것이 문제이지만, 나는 이것이 무엇을 의미하는지, 이것이 무엇을 일으켰는지, 내가 그것에 대해 할 수있는 것을 전혀 모른다.

+0

/Wall to VC++ 컴파일러 옵션을 추가해 보셨습니까? 힌트를 줄 수도 ... – Romain

답변

1

나는 약간 바보 같지만 대답을 찾았습니다. 내가 사용하고 있던 응용 프로그램 (exe)은 원래의 게시물에 언급 된 것에 대한 의존성을 가진 두 번째 다른 dll을로드 한 것 같습니다. 이 두 번째 dll은 여전히 ​​이전 함수를 예상했으며 업데이트 된 dll에 대해 다시 컴파일해야했습니다.

나를 도와 주려고하는 사람들에게 많은 감사를드립니다!

8

실제로 __declspec(dllexport)을 사용하고 있습니까? DLL (또는 그 DLL을로드하는 프로그램은 해당 선언없이 함수에 액세스 할 수 없습니다.)에 의해 함수가 내보내지지 않습니다.

또한 Dependency Walker을 사용하여 DLL에서 제공하는 기능을 정확히 확인하십시오.


__declspec(dllexport)는 함수 선언에 사용되지 않는다는 사실은 괜찮 - 대부분의 시간, 그것은 단지 그렇다면 그

#ifdef MAKING_DLL 
#define FOO_API __declspec(dllexport) 
#else 
#define FOO_API 
#endif 

처럼, 하나의 헤더 파일에 한 번 사용됩니다 해당 섹션 앞에 #define MAKING_DLL이 있으면 FOO_API int BakeACake()과 같이 선언 된 모든 함수는 MAKING_DLL이 정의되었는지 여부에 따라 내 보냅니다. 프로젝트가 빌드 된 프로젝트 유형 (예 : /DMAKING_DLL)에 따라 명령 줄에서 MAKING_DLL (또는 그와 동등한 것)을 정의해야하거나과 같이 FOO_API를 직접 정의해야 할 수도 있습니다.

종속성 워커의 비어있는 오른쪽 위 섹션은 프로그램이 DLL의 해당 .lib 파일과 연결되어 있지 않다는 것을 의미합니다. 괜찮습니다. 단지 DLL에있는 함수에 액세스하기 위해 LoadLibrary 또는 LoadLibraryEx을 사용하고 있음을 의미합니다.

변형 된 이름이 다른 사실을 기반으로 할 수있는 또 다른 시나리오는 DLL을 빌드하는 데 사용한 2008 년과 다른 Visual Studio 버전을 사용하여 프로그램을 작성한 것입니다. 일반 C와는 달리 C++에는 표준 바이너리 인터페이스가 없습니다. 즉, DLL에서 C++ 클래스를 사용할 때 동일한 컴파일러를 사용하여 프로그램과 DLL을 빌드해야합니다. 가능한 경우 VS2008에서 프로그램을 다시 시도하거나 프로그램이 빌드 된 것과 동일한 버전의 VS에서 DLL을 다시 시도하십시오.

+0

답변 주셔서 감사합니다! 나는 당신의 제안을 보았지만, 여전히 붙어있다 (내 질문에 대한 업데이트 참조). 더 많은 제안이 있다면, 그것은 좋을 것입니다! – Jordi

2

dependency walker을 다운로드하고이 도구를 사용하여 dll을 엽니 다. 그것은 dll에서 내 보낸 함수 목록을 보여줍니다. 위의 방법이 예상 기능의 일부인지 확인하십시오. 그렇지 않은 경우 해당 DLL의 클래스 중 하나에 대해 실수로 실수로 __declspec(dllexport)을 제거했음을 의미합니다.

+0

귀하의 답변은 위의 포스터와 정확히 같지만 어쨌든 감사합니다! 나는 제안을 시도했지만, 여전히 붙어있다 (내 질문에 대한 업데이트 참조). 나는 더 많은 도움에 감사 할 것입니다! – Jordi

+0

@ Jordi : 사람들이이 문제에 직면했을 때 가장 먼저해야 할 일입니다. 나는 우리가 함께 타이핑을 시작하고 그가/나 전에 완성했다고 생각한다. – Ponting

0

위 게시물의 정보를 사용하여 간단한 일반적인 해결책을 찾았습니다. 당신이해야 할 일은 의존성 워커 (dependency walker)와 함께 실행 가능한 열린 프로그램이다. 누락 된 기능을 찾고, dll이 그것을 사용하고 있는지 살펴보고, dll을 빌드하고 그것을 재 빌드하는 프로젝트를 찾는다.

관련 문제