2009-02-06 2 views
12

Visual Studio 2005를 사용하여 C/C++ 정적 라이브러리를 작성하려고합니다. 런타임 라이브러리 선택이 컴파일 옵션이므로 런타임 라이브러리의 각 변형에 대해 하나씩 네 가지 변형 라이브러리를 작성해야합니다. :왜 런타임 라이브러리는 링커 옵션이 아닌 컴파일러 옵션입니까?

  • /MT - 정적 런타임 라이브러리
  • /MD - DLL 런타임 라이브러리
  • /MTD - 디버그 정적 런타임 라이브러리
  • /MDD - 디버그 DLL 런타임 라이브러리

이들은 컴파일러 옵션이며 링커 옵션은 아닙니다. 리눅스 배경에서 오는 것은 이상하게 보입니다. 다른 런타임 라이브러리에는 다른 호출 규칙이 있습니까? 왜 다른 런타임 라이브러리를 링크 타임에 해결할 수 있습니까? 예를 들어 정적 라이브러리를 사용하는 응용 프로그램을 연결할 때?

+0

답안에 주어진이 좋은 이유가있는 것처럼 보이지만 나는 당신에게 동의합니다. 나는 항상 잘못된 장소에서이 설정을 찾는다. Precompiled Headers 설정의 경우와 마찬가지로 Preprocessor 섹션에있는 것이 아니라 자체 범주가 있습니다. –

답변

7
zdan 언급 _DLL_DEBUG 같은 C 처리기 정의

한 부작용 (예 : STL 용기 반복자)

일부 데이터 구조 때문인 같은 기능을 디버그 런타임 상이한 크기 일 수있다 _HAS_ITERATOR_DEBUGGING_SECURE_SCL. structure definitions that are binary-compatible with the library you're linking to으로 코드를 컴파일해야합니다.

당신이 혼합 및 다른 런타임 라이브러리에 대해 컴파일 된 일치하는 오브젝트 파일, 당신은 다음과 같은 링커 경고를받을 경우 : DLL의 정적 라이브러리를 생성 다른 컴퓨터 코드가 있습니다

warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs 
0

나는 이것에 대한 이유는 SEH (구조화 된 예외 처리기) 코드가 링크 된 런타임 라이브러리에 따라 다르게 생성된다는 것입니다.

1

정적 런타임을 무시하면 Linux와 동일한 옵션이 표시됩니다.

정적 런타임은 유용 할 수 있지만 실제로는 필요 없다고 알고 있습니다. 또한 메모리 할당/할당 해제 문제를 일으킬 수있는 잠재적 인 문제로 이어 지므로 DLL 런타임을 사용하는 것이 더 쉽습니다.

릴리스/디버그 버전은 Linux/Unix와 동일합니다.
효율성을 위해 필자는 필자가 단일 스레드 및 다중 스레드 버전의 라이브러리를 빌드하는 이유를 설명합니다.

8

이 옵션은 런타임 라이브러리 헤더 파일에 사용되는 정의 (예 : __DLL 및 __DEBUG)를 추가 할 수 있습니다. 공통적으로 할 일은 동적으로 링크 될 때 함수 선언에 __declspec (dllimport)를 추가하는 것입니다.

또한 컴파일러는 링커가 올바른 라이브러리에 연결하는 데 도움이되는 것으로 보입니다. 이것은 MSDN에 설명되어 있습니다.

3

컴파일러는 단일 스레드 또는 다중 스레드 코드를 생성하는지 알아야합니다. 기본적으로 컴파일러는 스레드 안전 코드 (멀티 스레드)를 생성합니다. 단일 스레드 코드를 원한다면 말해야합니다. 기본값을 변경하면 컴파일러는 기본 런타임 라이브러리를 변경합니다 (링커 ​​명령 옵션에서이 값을 항상 무시할 수 있습니다. 선택한 라이브러리의 코드가 동일해야합니다. 단일 스레드 정적, 다중 스레드 정적 또는 다중 스레드 DLL)로 구성됩니다. 단일 스레드 DLL 옵션이 없다는 것을 알아 두십시오 (정의에 따라 런타임 라이브러리 DLL은 여러 응용 프로그램에서 공유하므로 스레드 안전성으로 빌드되었습니다).

+1

또한 더 이상 단일 스레드 정적 런타임이 없습니다 (VC2005 또는 VC2008 시작한 경우 잘 모르겠습니다). –

0

.

공유 라이브러리를 빌드하려면 Linux에서 동일한 작업을 수행해야합니다. 컴파일러 플래그는 -fPIC이라고합니다. 그렇지 않으면 AMD64와 SPARC (그리고 아마도 다른 것들)에서 충돌 할 것입니다. i386 아키텍처에서 링커는 충분히 영리하며 메모리에서 라이브러리를 공유하지 않으므로 충돌이 발생하지 않습니다.

관련 문제