programing

c 코드를 c++ 코드에 연결할 때 g++ 연결 순서 종속성

kingscode 2023. 8. 9. 22:19
반응형

c 코드를 c++ 코드에 연결할 때 g++ 연결 순서 종속성

오늘 이전에 저는 항상 객체와 라이브러리가 링크 단계에서 g++로 전달되는 순서가 중요하지 않다고 생각했습니다.그리고 오늘은 c++ 코드에서 c코드로 링크를 시도했습니다.외부 "C" 블록에 모든 C 헤더를 감쌌지만 링커는 여전히 C 객체 아카이브에 있는 기호를 찾는 데 어려움을 겪었습니다.

당황한 저는 링크 오류를 분리하기 위해 비교적 간단한 예제를 만들었지만 놀랍게도 문제 없이 링크된 간단한 예제입니다.

약간의 시행착오 끝에, 저는 간단한 예시에 사용된 링크 패턴을 에뮬레이트함으로써 메인 코드를 링크 OK로 가져올 수 있다는 것을 알게 되었습니다.패턴은 먼저 객체 코드, 두 번째 객체 아카이브(예:

g++ -o serverCpp serverCpp.o algoC.o libcrypto.a

누가 이것이 왜 그런지 좀 밝혀줄 수 있습니까?저는 일반적인 c++ 코드를 연동할 때 이런 문제를 본 적이 없습니다.

당신이 매력적인 삶을 살기 전에 이것에 물리지 않았다면, 당신이 객체 파일과 라이브러리를 지정하는 순서는 GCC에서 매우 중요합니다.링커는 표시된 순서대로 기호를 검색하므로 라이브러리 함수에 대한 호출이 포함된 원본 파일을 라이브러리 앞에 놓아야 합니다. 그렇지 않으면 링커가 이를 해결해야 한다는 사실을 알지 못합니다.라이브러리의 복잡한 사용은 라이브러리를 한 번 이상 지정해야 한다는 것을 의미할 수 있으며, 이는 올바르게 적용하기 위한 왕실의 고통입니다.

gcc/g++로 전달되는 라이브러리 순서는 실제로 중요합니다. 만약A에 의존하는BA이(가) 먼저 나열되어야 합니다.그 이유는 참조되지 않은 기호를 최적화하기 때문에 라이브러리를 볼 수 있습니다.B첫째, 그리고 그 시점에서 아무도 그것을 언급하지 않았고 그러면 그것은 그것으로부터 아무것도 연결되지 않을 것입니다.

정적 라이브러리는 아카이브로 그룹화된 개체 파일의 모음입니다.링크를 연결할 때 링커는 현재 정의되지 않은 기호를 확인하는 데 필요한 개체만 선택합니다.개체는 명령줄에 지정된 순서대로 연결되므로 라이브러리에 종속된 모든 개체 뒤에 오는 경우에만 라이브러리의 개체가 포함됩니다.

따라서 링크 순서는 매우 중요합니다. 정적 라이브러리를 사용하려면 라이브러리 간에 순환 종속성을 도입하지 않고 종속성을 추적하도록 주의해야 합니다.

사용할 수 있습니다.--start-group archives --end-group아카이브 대신 종속 라이브러리 2개를 작성합니다.

gcc main.o -L. -Wl,--start-group -lobj_A -lobj_b -Wl,--end-group

언급URL : https://stackoverflow.com/questions/3363398/g-linking-order-dependency-when-linking-c-code-to-c-code

반응형