팀 프로젝트가 개발되는 방식으로 모든 .o
오브젝트 파일에서 애플리케이션 용 공유 객체 라이브러리를 생성합니다. 내 작업 (충분히 구체적이지만 다른 사람들이 사용하기에 충분히 일반적이기도하다!)은 마지막으로 실행 파일을 만든 이후로 변경된 개체 파일에만 연결하는 것입니다. 예를 들어 .so를 빌드하는 데 사용하는 명령 줄은 다음과 같습니다.리눅스에서 gcc를 사용하여 점진적으로 링크하기. 가능한가?
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so
예상대로 작동합니까? :) 내 목표는 동시 연결 프로세스의 속도를 높이기 위해 지금부터 변경된 개체 파일 만 연결할 수 있도록하는 것입니다. 예 명령은 다음과 같습니다 또한 libMySharedLibrary.so
에서 기존의 오브젝트 파일을 유지하면서, 새로운 오브젝트 파일과 libMySharedLibrary.so
을 업데이트
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so
. 실제로 위의 명령을 사용하여 libMySharedLibrary.so
을 생성하면 파일 크기가 모든 개체 파일이 포함 된 파일 크기보다 훨씬 작아서 위의 명령이 내가 원하는 것을 수행하지 못한다는 것을 거의 확신 할 수 있습니다.
내 연구를 통해 -i
링커에 대한 옵션이 있는데,이 옵션은 모든 개체 파일을 하나의 큰 개체 파일로 결합하는 것처럼 보이는 -r
옵션과 동일합니다. 불행히도 이것이 내가 원하는 것 같지는 않습니다.
즉, 초기 링크 이후에 변경된 오브젝트 파일에만 링크를하고 싶습니다. 따라서 향후 링크에 대한 링크 프로세스가 빨라집니다. 이것을 할 수있는 방법이 있습니까?
편집 : -i/-r
로 시도했다의 예 :
예 명령 : 나는 그것을 필요에 대해 나에게 고함을 중지 할 수 -nostdlib
태그를 추가했고, g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o
는 -shared
제거 -r
태그에서는 공유 객체가 허용되지 않기 때문입니다.
이 명령은 모든 .o 파일을 하나의 큰 .o 파일로 슬래 밍하는 것처럼 보입니다. 따라서 .o 파일 만 변경하면 여기에서 .o 파일 만 업데이트하면 좋을 것입니다. AllMyObjects.o가 처음 생성 된 후에는 다음 명령을 시도했습니다 : g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o
하지만 훨씬 작아서 (파일 크기대로) AllMyObjects.o
이 생성되므로 모든 오브젝트 파일을 가질 수 없다고 가정합니다. 나는 이것이 내가 작은 실수를 저 지르려고하는 것처럼 느낀다. 누구든지 조언을하나요? 미리 감사드립니다.
링크 단계가 실제로 증분 빌드를 지배합니까? 그렇지 않다면, 왜 귀찮게합니까? – dmckee
'-i' /'-r'로 시도한 것을 보여줄 수 있습니까? 심볼 충돌 ('대체'옵션이 없다는 것을 고려해보십시오)이 실행되기를 기대하지만 * 원하는 옵션입니다. –
링크 단계는 내 빌드에서 가장 시간이 많이 걸리는 부분이 아닙니다. 그러나 이것은 팀 리더가 내게 주었던 임무입니다. 우리는 이미 변경된 것을 컴파일하는 것만으로도 충분합니다. 현재 우리는 변경된 사항 만 컴파일하고 매번 모든 단일 오브젝트 파일을 다시 링크합니다. –