문제

Visual C++로 생성된 라이브러리에 대해 gcc를 연결할 수 있습니까?그렇다면 그렇게 함으로써 발생할 수 있는 갈등/문제가 있습니까?

도움이 되었습니까?

해결책

여기 답변의 일부 의견은 약간 너무 일반적입니다.

아니요, 언급된 특정한 경우 gcc 바이너리는 VC++ 라이브러리(AFAIK)와 연결되지 않습니다.코드/라이브러리를 상호 연결하는 실제 수단은 사용되는 ABI 표준에 대한 문제입니다.

임베디드 세계에서 점점 더 일반화되는 표준은 EABI(또는 ARM ABI) 표준입니다(Itanium 개발 중에 수행된 작업을 기반으로 함). http://www.codesourcery.com/cxx-abi/).컴파일러가 EABI와 호환되면 서로 작동하는 실행 파일과 라이브러리를 생성할 수 있습니다.함께 작동하는 여러 툴체인의 예로는 GCC ARM ABI 바이너리와 작동하는 바이너리를 생성하는 ARM의 RVCT 컴파일러가 있습니다.

(코드 소스 링크는 현재 다운되어 있지만 구글에 캐시될 수 있습니다)

다른 팁

나는 그렇지 않을 것 같아요.일반적으로 C++ 컴파일러에는 이름 변경 방법이 상당히 다릅니다. 이는 링커가 올바른 기호를 찾지 못한다는 것을 의미합니다.그건 그렇고, C++ 컴파일러는 표준에 따라 프로그램이 충돌하고, 죽고, 강아지를 먹고, 벽 전체에 페인트가 번지는 원인이 되는 것보다 훨씬 더 높은 수준의 비호환성을 허용하기 때문에 이것은 좋은 것입니다.

이 문제를 해결하기 위한 일반적인 체계에는 일반적으로 COM 또는 CORBA와 같은 언어 독립적인 기술이 포함됩니다.더 간단하고 정제된 방법은 C++ 코드 주위에 C "래퍼"를 사용하는 것입니다.

그것은 불가능합니다.일반적으로 동일한 컴파일러의 다른 버전에서 생성된 라이브러리를 링크하는 것도 불가능합니다.

아니요.평범하고 심플해요 :-)

예, 동적 링크로 만들고 인터페이스를 C 스타일로 만들면 가능합니다.lib.exe는 gcc 툴체인과 호환되는 가져오기 라이브러리를 생성합니다.

그러면 연결 문제가 해결됩니다.그러나 그것은 문제의 시작일 뿐이다.

더 큰 문제는 예외 및 메모리 할당과 같은 것입니다.

  • VC++에서 gcc 코드로 예외가 교차하지 않도록 해야 하며 호환성이 보장되지 않습니다.
  • VC++ 라이브러리의 모든 개체는 다음과 같은 이유로 힙에 있어야 합니다.
  • gcc new/delete를 VC++의 어떤 것과도 혼합하지 마십시오. 나쁜 일이 일어날 것입니다.이는 스택의 객체 생성에도 적용됩니다.그러나 create_some_obj()/delete_some_obj()와 같은 인터페이스를 만들면 gcc new를 사용하여 VC++ 개체를 생성하지 않게 됩니다.생성과 소멸을 처리하는 작은 핸들러 객체를 만들 수도 있습니다.이렇게 하면 RAII를 유지하면서도 실제 인터페이스에는 c 인터페이스를 계속 사용할 수 있습니다.
  • 호출 규칙이 정확해야 합니다.VC++에는 cdecl과 stdcall이 있습니다.gcc가 잘못된 호출 유형으로 가져온 함수를 호출하려고 하면 나쁜 일이 일어날 것입니다.

결론은 ANSI C와 호환되는 간단한 인터페이스를 유지하는 것입니다. 그러면 괜찮을 것입니다.미친 C++가 뒤에 있다는 사실은 그것이 포함되어 있는 한 괜찮습니다.

아, 그리고 모든 코드가 재진입 가능한지 확인하세요. 그렇지 않으면 완전히 다른 캔오웜을 열 위험이 있습니다.

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