포인트 : ws2_32.lib에 링크 된 타사 정적 라이브러리에 링크되는 일부 C++ 코드가 있습니다.dll을 정적 라이브러리로 바꾸기
목표 : 나는 어떤 DLL을 허용하고 독점적 인 UDP 프로토콜의 구현이되지 않습니다 제외하고 기본적으로 Win32 플랫폼 인 임베디드 플랫폼에 포트에 방법이 C++ 코드를 조사하고 .
전략 : 내가 정적 라이브러리를 쓰고 싶습니다 모방 윈속 API (또는 내가 걱정이 API의 최소 부분 집합). 이러한 관련 winsock 함수는 임베디드 플랫폼에서 지원하는 독점 UDP 함수 호출에 대한 래퍼 역할을합니다.
가정 : 이 정적 라이브러리를 ws2_32.lib 대신 최종 실행 파일에 연결할 수 있습니다.
질문 :
- 내 가정이 올바른/합리적인가요?
- 어떻게 링크를 기계적으로 설정합니까? 내가 무슨 짓을
은 : 그래서에 하나 개의 기능을 수행하는 시도, 및 연결 수없는 것. 이것은 내가 내 정적 라이브러리에서 정의한 것입니다 : 내가 연결하면
unsigned short __stdcall htons(unsigned short hostshort) {
return hostshort;
}
, 나는 다음과 같은 오류가 발생합니다 :
: error LNK2001: unresolved external symbol [email protected]
링크 메시지에서이 __imp__
접두사 내가 확실히 이해하지 못하는 무언가이다. dll에 정의 된 함수의 이름이 특별한 방법으로 바뀌었고 정적 라이브러리에서이를 위조하여 어떻게 든 링커가 ws2_32.lib에있는 함수 대신 내 버전의 함수에 연결하도록 할 수 있습니까?
도움을 주시면 감사하겠습니다.
실은 나는 extern "C"'에 대해 생각하지 않는다는 사실에 매우 당혹 스럽다. 위의 벤이 게시물과 함께 완벽하게 트릭을 했나요? 파일 이름을'FakeWS2_32.cpp'에서'FakeWS2_32.c'로 변경하고'unsigned short __stdcall _imp__htons (unsigned short a) {return a; }'. 링크가 성공했습니다. 이러한 메커니즘을 제쳐두고 내 상황에서 약 20 개의 winsock 기능을 다시 구현하는 대신에 무엇을 권하고 싶습니까? –
대안이 없습니다. 나는 Zach가 Windows에 포함 된 네트워크 스택을 교체하지 말 것을 권장하고 있습니다 ... 귀하의 플랫폼에는 Windows 네트워크 스택조차 없기 때문에 적용되지 않습니다 (거기에없는 것을 대체 할 수는 없습니다). –
좋은 지적. 내 의자에서 나는 대안을 찾지 못한다. 난 단지 다시 구현해야 할 winsock API 호출의 작은 하위 집합을 찾을 수 있기를 희망하고 있으며 독점 API를 사용하여이를 수행 할 수 있기를 바랍니다. 도움을 주신 모든 분들께 감사드립니다. 정말 잘 작동합니다. –