2016-10-02 12 views
2

Я программировал на 32-битной машине, до недавнего времени я обновлялся до 64-битного. Я использую последнюю версию DMD (amd64), на xubuntu 16.04 (amd64).DMD2 не удается скомпилировать общую библиотеку в Linux, amd64

Перед обновлением я мог легко скомпилировать общие библиотеки с помощью dmd -shared 'FILES', но теперь он дает ошибку. У меня есть файл с именем QD:

module q; 

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

И теперь, когда я dmd -shared 'q.d', я получаю это:

nafees[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 

Как я могу получить его компилировать?

EDIT: библиотека компилируется отлично, если я использую флаг -m32.

+0

Возможно, это связано с тем, что вы использовали кеширование '--force'? Кроме того, я помню, что эта проблема была с установкой «hardening-wrapper». Удаление, которое исправило это для меня. – weltensturm

+0

@weltensturm Я пробовал делать 'dmd -shared -force q.d', но он говорит, что' --force' является непризнанным переключателем. И у меня нет отвердителя. – Nafees

ответ

2

О, я просто понял, что знаю эту проблему, извините, мне потребовалось столько времени, чтобы это понять.

Вам просто нужно скомпилировать с общим lib Phobos, чтобы сделать общий доступ к 64-битной библиотеке.

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

Переключатель -defaultlib говорит его использовать альтернативную библиотеку. Указывая .so (в отличие от статической ссылки по умолчанию с файлом .a), он использует общую библиотеку lib, которая также компилируется с помощью -fPIC, поэтому она совместима.

Среди других преимуществ здесь заключается в том, что одна среда выполнения может быть разделена между всеми общими объектами и исполняемыми файлами D, что означает, что многие вещи просто работают, когда вы их распространяете (хотя обратите внимание, что вам также может понадобиться скомпилировать программу, которая загружает это так с помощью переключателя -defaultlib). На 32-битной основе библиотека не построена с этими параметрами независимо ... но в результате вы можете увидеть ошибки ссылок для нескольких определений в некоторых случаях.

Единственное, что нужно быть осторожным, так это то, что файл libphobos2.so также является средой выполнения, не забудьте распространять его вместе с собственной библиотекой. Возможно, вам нужно будет установить LD_LIBRARY_PATH или установить его по всему миру, чтобы программа запускалась правильно, как и любая другая библиотека (и вы, возможно, захотите ее также изменить).