4

Visual Studio 2008에서 Visual Studio 6을 사용하여 컴파일 된 C++ 정적 라이브러리 (.lib)를 사용할 수 있습니까?Visual Studio 2008에서 Visual Studio 6 컴파일 된 C++ 정적 라이브러리를 사용할 수 있습니까?

+0

VS2008에서 C++과 함께 사용할 수 있는지, 그리고 C# 또는 VB.NET과 같은 관리 언어에서 호출 할 수 있는지 여부를 묻는 것으로 가정합니다. 후자의 경우 질문을 수정하여 명확하게하십시오. –

답변

3

보통 CRT 메모리 경계를 유지한다면 (즉, 라이브러리 함수 내부에서 메모리를 할당하는 경우 항상 라이브러리 내부에서 메모리를 확보하면됩니다.) lib에서 함수를 호출하여 해방).

이 접근법은 모든 종류의 컴파일러로 컴파일 된 dll에서 정상적으로 작동하지만 정적으로 링크 된 libs도 괜찮습니다.

1

예. 이것에 전혀 문제가 없어야합니다. 언급 된대로 gbjbaanb을 기억해 두어야하지만 VS2008은 계속 작동합니다. CLR과 (관리되는) 코드를 혼합하려고하지 않는 한. 가능하다면 반대하는 것이 좋습니다. 그러나 원시 C 또는 C++ 코드에 대해 말하면 확실합니다.

정확히 사용할 계획이 있습니까? (이 라이브러리에는 무엇이 있습니까?) 이미 시도해 보았지만 문제가 있습니까? 아니면 방금 작업하지 못한 것을 얻기 위해 많은 시간을 낭비하기 전에 확인하고 계십니까?

+0

나는 그것을 작동 시키려고 노력하는 많은 시간을 낭비하기 전에 단지 묻고있다. 나는 컴파일 된 .lib 라이브러리와 그것을 사용하는데 필요한 헤더 파일 만 가지고 있으므로 전체 라이브러리를 다시 컴파일 할 수 없었을 것입니다. –

0

물론 작동합니다.

VS2008에서 참조를 코딩하는 위치를 묻는 중입니까?

그렇다면 속성 페이지에서 구성 등록 정보의 proj props -> 링커 -> 입력으로 이동하십시오. "추가 종속성"찾아 해당 .LIB 코드.

proj props -> Linker -> General로 이동하여 "Additional Library Directories"에서 libs 경로를 코딩하십시오.

그렇게해야합니다!

0

대답이 '아니오'인 경우가 있습니다. 우리는 VS6에서 VS2k5로 이동할 때 메모리 모델이 변경되면서 모든 라이브러리를 다시 빌드해야하고 CRT 기능은 다를 수 있습니다.

+0

그러므로 요점은 - 당신이 lib 내의 모든 CRT 호출을 유지한다면, 아무 문제 없어. 릴리스와 디버그 빌드를 섞기도합니다. lib 내부에 CRT fn을 호출하고 메모리를 외부로 전달한 다음 앱에서 조작하게하고 문제가 발생할 것으로 기대하십시오. 간단한 캡슐화가 답입니다. – gbjbaanb

+0

메모리 할당에 대한 의미를 얻는 동안 VS2K5는 VS6 라이브러리 사용을 거부했습니다. 그것은 2 년 전이었습니다. 그래서 그것이 내게 준 정확한 오류는 기억이 안납니다. 우리는 수년간 재 컴파일되지 않은 라이브러리에 대한 코드를 추적하고 VS2K5에서 다시 빌드해야했습니다. –

5

정말 다릅니다. lib는 메모리가 직접 Win32 메서드 (CoTaskMemAlloc 등)에 의해 관리되거나 호출자가 호출 수신자가 할당 한 메모리를 절대로 해제하지 않거나 반대의 경우에도 'extern "C"함수 만 노출합니까? VS 6 이후로 많이 변경되지 않은 기본 라이브러리에만 의존합니까? 그렇다면 괜찮을 것입니다.

살펴볼 두 가지 기본 사항이 있습니다. 타사 라이브러리에서 사용하는 전역 변수의 변경, 타사 라이브러리에서 정의한 구조체, 클래스 등의 구조 변경. 예를 들어, CRT 메모리 할당자는 아마도 두 버전 간의 숨겨진 할당 관리 구조를 변경했을 수 있습니다. 따라서 한 버전의 라이브러리에서 메모리 조각을 할당하고 다른 조각을 사용하면 충돌이 발생할 수 있습니다.

또 다른 예로, 인터페이스를 통해 C++ 클래스를 노출하고 MFC와 같은 MS 런타임 라이브러리를 사용하는 경우 클래스 레이아웃이 VS 6과 VS 2008 사이에서 변경 될 수 있습니다. 즉, 멤버/필드 액세스 수업 시간에 예상치 못한 결과를 초래할 수 있습니다. .lib가 어느 정도의 용량으로 MFC를 사용한다면 아마도 hose가 될 것이다. MFC는 많은 수의 전역을 정의하고 내부적으로 사용하며 MFC 인프라가 호스팅 환경에서 변경된 경우 .lib의 작업으로 MFC 전역에 대한 모든 액세스가 실패 할 수 있습니다 (VS 6 이후로 많이 변경되었습니다).

MFC 헤더의 변경 내용을 자세히 조사하지는 않았지만 다른 VS 버전으로 컴파일 된 MFC/ATL 기반 클래스 바이너리간에 예기치 않은 동작이 발생했습니다.

이러한 문제 외에도 런타임 라이브러리에 정의 된 정적 전역 변수에 의존하는 strtok() 같은 함수에 위험이 있습니다. 확실하지는 않지만 멀티 스레딩 CRT에서 생성 된 스레드에서 단일 스레드 CRT를 예상하는 클라이언트를 사용하면 해당 정적 변수가 제대로 초기화되지 않을 수 있습니다. 자세한 정보는 _beginthread() 문서를보십시오.

0

VC6, VS2003, VS2005 및 VS2008간에 몇 가지 주요 변경 사항이있었습니다. Visual C++ (VS2005)는 정적으로 링크 된 단일 스레드 CRT 라이브러리에 대한 지원을 중단했습니다. 몇 가지 주요 변경 사항은 herehere입니다. 이러한 변경 사항은 이후 버전에서 VC6 빌드 라이브러리 사용에 영향을 미칩니다.

관련 문제