링커가 원격 시작 코드를 최적화하는 것을 방지하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1300778

문제

다음과 같은 문제가 있습니다. (C ++-) 프로젝트는 여러 하위 프로젝트로 구성됩니다. 각각에는 스타트 업에서 실행하려는 코드가 포함 된 여러 파일이 있습니다. 지금까지 내 솔루션은 초기화에서 각 코드를 호출하는 정적 변수를 사용하는 것입니다.

// Foo.cpp

static TFooRegistry sFooRegistry;   // does stuff in constructor.

각 하위 프로젝트에 대해 DLL을 사용하여 프로젝트를 구축 할 때는 모든 것이 잘 작동하며 코드는 예상대로 실행됩니다. 그러나 하위 프로젝트를 정적으로 연결할 때 링커는 foo.o에 외부에서 참조 된 코드가 포함되어 있지 않다고 결정합니다. 물론 다른 곳에서 sfooregistry에 대한 언급을 추가 할 수는 있지만 이것은 지루하고 오류가 발생하기 쉽습니다.

이것을 해결하는 방법은 무엇입니까?

좋아, Mac/GCC 및 Win/Visual Studio에서 무엇을 할 수 있습니까?

도움이 되었습니까?

해결책

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

또한 링커는 시작 코드를 최적화하지 않습니다.이 코드는 단순히 사용되지 않기 때문에 연결하지 않습니다. 링커는 꽤 어리석은 짐승입니다 - 그들이하는 일을 어떻게하는지 알고 싶다면 책을 살펴보십시오. 링커 및 로더.

다른 팁

약간의 속임수이지만 검토하십시오. Win System (그러나 Linux는 아님)의 경우 명시 적 Dllexport를 사용하십시오.이 경우 링커는이 기호가 OUTER APP에서 사용하는지 여부를 알 수 없습니다.

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