[일부 어셈블러 | 다른 컴파일러 | 아카이브]를 링커에 직접 보냅니다.컴파일러가 사용하고있는 * 실제 링커 *를 임의의 시스템에서 어떻게 찾을 수 있습니까?
하지만 경로에서 발견 된 ld
은 [broken | 실종 | 잘못된 ABI를위한 링크].
가끔은 심지어 ld
을 찾을 수 없습니다.
C 컴파일러가 무엇이든간에 실제로 사용되는 링커를 어떻게 찾을 수 있습니까?
[Mac | 리눅스에서 | BSD에서 | 구성 스크립트에서]?
[일부 어셈블러 | 다른 컴파일러 | 아카이브]를 링커에 직접 보냅니다.컴파일러가 사용하고있는 * 실제 링커 *를 임의의 시스템에서 어떻게 찾을 수 있습니까?
하지만 경로에서 발견 된 ld
은 [broken | 실종 | 잘못된 ABI를위한 링크].
가끔은 심지어 ld
을 찾을 수 없습니다.
C 컴파일러가 무엇이든간에 실제로 사용되는 링커를 어떻게 찾을 수 있습니까?
[Mac | 리눅스에서 | BSD에서 | 구성 스크립트에서]?
나는 이것을 알아 내야했습니다.
힘든 일 이었기 때문에 나눌 것을 생각했습니다. ,
이 사람 어서, 필요의 방법을
#!/usr/bin/env sh # 'main;' is the shortest C program possible (I think.). # So it is compiled, linked, and written to /dev/null. # So if the linker can't link, this should return 1. for link in collect2 ld; do # Order matters, because of GCC. echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep -q $link && echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep $link | sed -e "s|\(.*$link\).*|\1|" -e 's/ //g' -e 's|"||' && break done # That should work on just about anything, and returns an absolute path, # except with ICC. If we want to try to get an absolute path there too, # we have to: # If 'which' is missing, and it might not have an -s flag. which="$(which which >/dev/null 2>&1)" || which=echo $which "$(for link in collect2 ld; do echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep -q $link && echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep $link | sed -e "s|\(.*$link\).*|\1|" -e 's/ //g' -e 's|"||' && break done)"
그래서 당신이있을 방금 말한 :
이 주사를하지 않습니다! 그냥,
which ld
처럼.
정직하고 진정으로 시간 낭비가 많습니다.
ld
은 종종 래퍼이므로 그다지 특이하지 않습니다.
#!/usr/bin/env sh
# On my Mac, nothing too special, I swear.
# Just a MacBook, Xcode, GCC from Homebrew, and one commercial compiler.
echo; $which ld; echo "...Not necessarily."; echo
for CC in cc gcc clang icc; do echo $c:
for link in collect2 ld; do
echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep -q $link &&
echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep $link |
sed -e "s|\(.*$link\).*|\1|" -e 's/ //g' -e 's|"||' && break
done
which="$(which which 2>/dev/null 1>&1)" || which=echo
$which "$(for link in collect2 ld; do
echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep -q $link &&
echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep $link |
sed -e "s|\(.*$link\).*|\1|" -e 's/ //g' -e 's|"||' && break
done)"
echo
done
반환 :
는 테스트 변합니다 것을 볼 수 있습니다
/usr/bin/ld
...Not necessarily.
cc:
/Applications/Xcode51-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld
/Applications/Xcode51-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld
gcc:
/Users/Shared/usr/local/Cellar/gcc49/4.9-20140119/libexec/gcc/x86_64-apple-darwin13.1.0/4.9.0/collect2
/Users/Shared/usr/local/Cellar/gcc49/4.9-20140119/libexec/gcc/x86_64-apple-darwin13.1.0/4.9.0/collect2
clang:
/Applications/Xcode51-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld
/Applications/Xcode51-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld
icc:
ld
/usr/bin/ld
스택 오버플로가 답변을 수락하거나 현상금을 시작해야한다고 알려줍니다. 그래서 나는 여기에 내 대답을 받아 들일 것이다. 그것은 아닙니다 : [질문에 대한 마지막 코멘트] (http://stackoverflow.com/questions/21605720/how-can-i-find-and-test-the-actual-linker-a-compiler-is-using 참조) -on-an-arbitrary # comment32666361_21605720). –
GCC와 연타'-print-프로그 이름 = ld'로 - 나는 ICC에 대해 알고하지 않습니다 . 컴파일러를 호출하여 객체를 연결할 수 있습니다 (소스 없음). –
@BrettHale 사실, '-print-prog-name = ld'이 실제로 트릭을하지 않기 때문에 질문과 답변을 올렸습니다. 예를 들어'gcc -print-prog-name = ld'는 내 시스템에서 'ld'가 아닌'collect2' 래퍼를 호출하기 때문에 단순히 'ld'를 되돌려줍니다. –
Re : '항상 컴파일러를 호출하여 대신'- 사실입니까? 그렇다면 위대한 것입니다,하지만 내가 할 수있는 방법을 알아낼 수없는 몇 가지 옵션이 있습니다. 예를 들어, 컴파일러 프론트 엔드를 통해 객체를 병합하려면 어떻게'ld -r'합니까? –