2012-11-14 3 views
1

주 솔루션에 연결된 DLL로 대상이되는 라이브러리를 만들고 있습니다.다른 C++ 환경으로 DLL 만들기

이 새로운 DLL은 매우 복잡하며 C++ 11 기능을 사용하고 싶습니다. 가장 확실하게 링크 할 프로그램은 아닙니다. 실제로, 주 프로그램은 현재 VS2008과 VS2010을 사용하여 "깔끔하게"빌드되었습니다 (그리고 나는 리눅스 용 GCC 4.3을 생각합니까?).

내가 제안하는 것 :

/.so를 .DLL에 컴파일을위한 IDE와 인텔 C++ 컴파일러 2013 VS2012를 사용하여 - 리눅스 - 내가 이해 등의 같은 (기계 양식에 기본적으로 아래이다. exe).

  1. 이 가능한 경우

    내가 문제를 해결하기 위해 C++를 사용하는 데 익숙 해요 동안

    , 나는 컴파일/링크 등을 따라서의 기초를 유창하게 구사하지 않다, 나는 지역 사회를 부탁하고 싶습니다
  2. 가능하다면 간단합니까? (설명했듯이 간단합니다.)/그 길에 어떤 함정이나 문제점을 예상 할 수 있습니까? 우려의

지역은 내가 예상 :

  • 런타임 라이브러리 -이이 노력을 탈선 요인이 될 것으로 기대합니다. 나는 그들에 대해 아무것도 모르고/그들이 어떻게 문제를 일으킬 수 있다는 것을 제외하고는 어떻게 작동 하는지를 압니다.
  • 표준 라이브러리 구현의 차이점 - DLL 형식이 다운되면 중요합니까?
  • threading conflicts - dll 스레드와 주 프로그램 스레드가 동일한 데이터를 수정하지 않으며 실제로 주 프로그램의 스레드 중 하나가 DLL 함수를 호출합니다.

보너스 : 위의 내용은 내가 예상하는 경로이지만 intellisense, 일반보기 등 (이 코드는 기본적으로 주 솔루션의 프로젝트가 될 수 있음)을 위해이 코드를 열어 놓는 것이 이상적입니다. 다른 런타임 라이브러리/컴파일러를 지정하는 방법이 있습니까? 이 작업을 수행 할 수 있습니까?

EDIT :이 보너스 부분의 주된 이유는 주 프로그램과이 라이브러리를 별도로 구축 할 경우 발생할 수있는 "버전 관리"충돌을 없애기 위해서입니다.

참고 : C++ 11은 최신 버전이기 때문에 강력한 형식의 열거 형 및 크로스 플랫폼 스레딩 코드는 라이브러리에 큰 보너스가 될 것입니다.

답변

2

"응용 프로그램이 다른 컴파일러로 빌드 된 라이브러리를 사용할 수 있습니까?" (대답은 '예'입니다.) 그러나 "다른 컴파일러와 C++ 표준 라이브러리로 작성된 라이브러리의 공개 인터페이스에는 어떤 C++ 기능을 사용할 수 있습니까?"

Windows에서 대답은"거의 없음 "입니다 인터페이스 (가상 함수 만 포함하는 클래스) 데이터 항목이있는 클래스 없음 예외 없음 런타임 객체 없음 (iostream 인스턴스 또는 문자열과 같음) 템플릿 없음 .

리눅스에서 대답은 "더 많지만 많지 않음"입니다. ODR이 충족되면 클래스는 정상적으로 작동합니다. 예외는 작동합니다. 템플릿도 정의가 정확히 둘 다 동일하면 표준 라이브러리 유형의 정의는 C++ 03과 C++ 11 사이에서 변경되었으므로 예를 들어 응용 프로그램과 라이브러리간에 std::string 또는 std::vector<int> 개 객체를 전달할 수는 없습니다 (양측 모두 이러한 기능을 사용할 수 있지만 동일한 객체는 교차 할 수 없습니다.)

+0

:/그래서 크로스 플랫폼, C + + 11 코드 조각, ICC2013로 마이 그 레이션하는 전체 솔루션을 설득해야 할 것 같아, 어휴 회의 예. (컴파일러를 마이그레이션하는 것이 충분합니까? 고려해야 할 사항은 무엇입니까?) –

+0

@ AK4749 : 컴파일러 외의 다른 것은 하나의 정의 규칙을 위반하지 않았는지 확인하는 것입니다. 따라서 규칙을 호출하거나 디버그 반복자 또는 클래스 레이아웃을 변경할 수있는 유사한 옵션을 사용할 수있는 옵션이있는 경우 해당 클래스가 모든 모듈에서 동일하게 설정되어 있는지 확인하십시오. 그런 다음 메모리가 다른 할당 자로 인해 해제되지 않았는지 확인해야합니다. –

+0

아아, 생각해 봅시다. * 할당을 고려했습니다. 이 라이브러리가 할당 한 모든 메모리는이 라이브러리가 전적으로 소유하므로 괜찮습니다. 다른 점에 대해 자세히 살펴 보겠습니다. ICC2013에는 end-to-end C++ 11 실행 파일에 필요한 모든 라이브러리/etc가 있어야합니다. 여기에서 제가 읽은 것입니다. 그 맞습니까? 그리고 실행 환경에 이전 런타임 라이브러리와 호환되지 않는 새로운 런타임 라이브러리가 필요합니까? 당신의 도움을 주셔서 감사합니다. –

1

C++에서는 불가능합니다. 특히 이름 맹 글링은 다를 수 있습니다. 연결된 모든 C++ 파일은 동일한 컴파일러로 컴파일해야합니다.

C++에서 extern "C" 항목은 표준 (이름 지정, 호출 규칙)이므로 C 라이브러리는 C++에서 호출 할 수 있으며 extern "C" 블록으로 선언 된 C++ 함수에서 호출 할 수 있습니다. 이것은 클래스, 템플릿, 오버로드를 제외하고, 다른 컴파일러에 의해 컴파일 된 것들은 혼합 할 수 없습니다.

유감입니다.

+2

다른 컴파일러에서 빌드 된 라이브러리는 C 인터페이스에서 만나는 경우 호환됩니다. 그러나 이것이 C로 작성되어야한다는 것을 의미하지는 않습니다. 공용 C 인터페이스를 내보내는 C++ 코드를 작성할 수 있습니다. 또한 Windows 이외의 플랫폼에서도 C++ 인터페이스를 사용하는 표준 C++ ABI를 정의하기도합니다. –

+1

또한 "당신은 사소한 테스트를 할 수 있습니다"는이 경우에는 아주 좋은 제안이 아닙니다. 사소한 테스트가 효과적 일지 모르지만, 상속이나 최적화 등을 할 때 문제가되지 않는다는 것을 의미하지는 않습니다. –

+1

@BenVoigt 좋은 점, 나는 대답을 고쳐 썼다. – hyde