2009-08-19 2 views
3

다음과 같은 문제가 있습니다. My (C++ -) 프로젝트는 여러 하위 프로젝트로 구성됩니다. 각각의 파일에는 시작시 실행할 코드가 여러 개 있습니다.링커가 시작 코드를 최적화하지 못하게하는 방법은 무엇입니까?

// Foo.cpp 

static TFooRegistry sFooRegistry; // does stuff in constructor. 

각 하위 프로젝트에 대한 DLL을 사용하여 내 프로젝트를 구축, 모든 것이 잘 작동하고 예상대로 코드를 실행 : 내 솔루션은 지금까지처럼 초기에 각각의 코드를 호출하는 정적 변수를 사용하는 것입니다. 그러나 서브 프로젝트를 정적으로 링크 할 때 링커는 Foo.o에 외부에서 참조 된 코드가없는 것으로 판단하고이를 최적화합니다. 물론 다른 곳의 sFooRegistry에 대한 참조를 추가 할 수는 있지만 지루하고 오류가 발생하기 쉽습니다.

해결 방법은 무엇입니까 (표준을 준수합니까?)?

OK, mac/gcc 및 win/visual studio에서 무엇을 할 수 있습니까?

답변

4

라이브러리의 개체를 초기화하는 표준 준수 방법이 없습니다. 특정 플랫폼에 따라 트릭을 사용해야합니다. DLL과 정적 라이브러리 (Windows의 경우 최소한)의 차이점은 OS가 실행하는 시작 및 종료 코드가 전자는 있지만 객체 파일은 단지 연결이라는 점입니다.

또한 링커는 시작 코드를 최적화하지 않습니다. 링커는 링크를 사용하지 않습니다. 링크가 사용되지 않았기 때문입니다. 링커 은 꽤 어리석은 동물입니다. 그들이하는 일을 어떻게하는지 알고 싶다면 Linkers & Loaders을보십시오.

+0

Doh! 친애하는 비얀 : 왜요? – Tobias

+0

링커가 코드를 최적화하고 링크하지 않는 것은 무엇입니까? 나는 이것이 똑같은 두 가지 이름이라고 생각했다. – Tobias

+0

C++은 생성자 개념이없는 기존 링커 (Stroustrup의 D & E 책 참조)와 함께 작동하도록 설계되었습니다. –

1

몇 가지 트릭이 있지만 리뷰를 작성하십시오. Windows 시스템 (Linux는 아님)의 경우 명시 적 dllexport를 사용하십시오.이 경우 링커는이 기호가 외부 응용 프로그램에서 사용되는지 여부를 압니다.