2016-10-02 2 views
2

저는 32 비트 머신에서 프로그래밍 했었습니다. 최근까지 64 비트로 업그레이드했습니다. xubuntu 16.04 (amd64)에서 최신 버전의 DMD (amd64)를 사용하고 있습니다.DMD2가 Linux에서 공유 라이브러리를 컴파일하지 못했습니다. amd64

업그레이드하기 전에 dmd -shared 'FILES'을 사용하여 쉽게 공유 라이브러리를 컴파일 할 수 있었지만 이제는 오류가 발생합니다. 나는라는 이름의 파일 QD 있습니다

module q; 

export extern(C) int abcd(){ 
    return 4; 
} 

와 지금은 dmd -shared 'q.d'을 수행 할 때,이 얻을 :

[email protected]:~/Desktop/temp$ dmd -shared q.d 
/usr/bin/ld: q.o: relocation R_X86_64_32 against `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC 
q.o: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 
--- errorlevel 1 

을 내가 dmd -shared -fPIC q.d 수행 할 때

[email protected]:~/Desktop/temp$ dmd -shared -fPIC q.d 
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libphobos2.a(exception_224_3b4.o): relocation R_X86_64_32 against `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC 
/usr/lib/x86_64-linux-gnu/libphobos2.a: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 
--- errorlevel 1 

을 어떻게 얻을 수 있습니다 그것은 컴파일?

편집 : -m32 플래그를 사용하면 라이브러리가 잘 컴파일됩니다.

+0

캐시 된 항목이 있기 때문에 시도했을 수 있습니다. '- 힘'? 또한,'hardening-wrapper'가 설치된 이슈를 기억하고 있습니다. 그것을 제거하는 것은 저를 위해 그것을 고쳤다. – weltensturm

+0

@weltensturm'dmd -shared --force q.d'를 시도했지만'--force'는 인식 할 수없는 스위치라고합니다. 그리고 난 경화 포장지가 설치되어 있지 않습니다. – Nafees

답변

2

아, 방금이 문제를 알고 있다는 것을 깨달았습니다. 미안하지만 실현하기까지 너무 오래 걸렸습니다.

64 비트 공유 라이브러리를 만들려면 공유 라이브러리 Phobos에 대해서도 컴파일하면됩니다.

dmd -shared q -m64 -fPIC -defaultlib=libphobos2.so 

스위치 -defaultlib 스위치는 대체 라이브러리를 사용하도록 지시합니다. .a 파일의 기본 정적 링크와 반대로 .so을 지정하면 -fPIC으로 컴파일되는 공유 라이브러리가 사용되므로 모두 호환됩니다.

다른 장점 중 하나는 모든 공유 객체 및 D 실행 파일에서 하나의 런타임을 공유 할 수 있다는 것입니다. 즉, 모든 것을 배포 할 때 많은 기능이 작동합니다 (로드하는 프로그램을 컴파일해야 할 수도 있음을 유의하십시오. 이것도 -defaultlib 스위치로). 32 비트에서 라이브러리는 관계없이 이러한 옵션을 사용하여 빌드되지 않지만 결과는 경우에 따라 여러 정의에 대한 링크 오류를 볼 수 있다는 것입니다.

비록 한 가지주의해야 할 점은 libphobos2.so 파일은 현재 런타임 종속성이기 때문에 함께 빌드 한 라이브러리를 함께 배포해야합니다. LD_LIBRARY_PATH을 설정하거나 다른 라이브러리와 마찬가지로 프로그램이 올바르게 시작되도록 전역 적으로 설치해야 할 수도 있습니다.

관련 문제