문제

C ++에서 정적 라이브러리 A는 동적 라이브러리 B와 C에 연결됩니다. 클래스 인 FOO가 B에 정의 된 A에 사용되는 경우 FOO를 사용하지 않으면 C 링크가 있습니까?

나는 대답이 예라고 생각했지만 이제는 Library C가 FOO가 정의되지 않은 기호라고 말하면서 XLC_R7과의 문제가 발생하고 있습니다. 그것의 내 문제는 라이브러리 C가 그것을 참조하는 클래스를 사용하지 않는다는 것입니다. 이것은 Win32 (VC6) 및 OpenVMS로 연결됩니다.

링커 불일치입니까 아니면 PBCAK입니까?

새로운 정보 :

  1. B는 C에 따라 다르지만 비자 versa는 아닙니다.

  2. /opt : ref를 사용하지 않고 Windows에서 링크하고 문제없이 연결됩니다.

도움이 되었습니까?

해결책

정적으로 연결하면 두 모듈이 하나가됩니다. 따라서 C를 컴파일하고 A를 연결하면 A의 모든 소스 코드를 C의 소스 코드에 복사 한 다음 결합 된 소스를 컴파일했습니다. 따라서 C.dll에는 A를 통해 B를 통해 B에 의존하는 A가 포함되어 있습니다. 해당 종속성을 만족 시키려면 C를 B의 링크 라이브러리에 연결해야합니다.

귀하의 정보에 따르면, 이것은 B와 C 사이의 원형 의존성을 만듭니다.

다른 팁

LD가 왼쪽에서 오른쪽으로 라이브러리를 연결하고 나중에 요구되는 첫 번째 참조가있는 경우 LD가 링커 (LD/UNIX) 인 것 같습니다. 일반적인 요령은 명령 끝에 첫 번째 라이브러리 (또는 필요한 라이브러리)를 추가하는 것입니다.

시도해보세요 ....

B에 대한 내보내기 Lib를 포함하여 C에 대한 링크 라인입니까? 그렇다면 Richard가 제안한 것처럼 주문한 것 같습니다.

또 다른 제안은 C가 A에서 해당 함수가 필요하지 않은 경우, 이는 /opt : ref switch에서 달성 한 Microsoft 링커의 경우 C가 해당 기능을 필요로하지 않는 경우, 참조되지 않은 기호를 무시할 링커 옵션이 있는지 확인하는 것입니다.

C가 연결되지 않는 유일한 이유는 컴파일러가 생각하기 때문입니다. 하다 Foo 기호가 필요합니다.

C는 FOO 기호를 언급하지 않기 때문에 링커에 기호가 필요한 또 다른 이유가 있어야합니다.

내가 아는 유일한 이유는 어떤 종류의 수출입니다. 나는 Visual C ++에 대해서만 알고 있으므로 동등한 것을 검색하는 것이 좋습니다. __declspec( dllexport ) 전처리 파일에서 무엇을 생성하는지 확인하십시오.

내가 할 일은 다음과 같습니다. 전처리 출력을 별도의 파일에 저장하고 FOO의 발생을 검색하십시오. 수출로 발생하거나 컴파일러가 어떤 식 으로든 참조되었습니다.

특정 기능의 정의가 필요하지 않은 경우 연결 단계에서 해당 라이브러리가 연결되지 않습니다. 귀하의 경우, FOO의 정의가 라이브러리 B가 아닌 라이브러리 B에 존재하기 때문에 라이브러리 C는 실행 파일을로드하는 동안 메모리에로드되지 않습니다.

그러나 라이브러리 C에서 Foo () 함수를 사용하는 것 같습니다. 해당 오류가 발생하기 때문입니다.

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