`gh c --make -shared -dynami c -too` для компиляции библиотеки stati c и dynamici c - PullRequest
2 голосов
/ 14 марта 2020

Я пытаюсь скомпилировать haskell пакет без использования cabal

При правильном .conf файле это похоже на работу

    cd src; ghc --make -dynamic -shared -fPIC -package-name adventlib System/IO/Advent.hs System/IO/Test.hs -osuf dyn_o -hisuf dyn_hi -o libHSadventlib-ghc8.6.5.so
    cd src; ghc -c --make -package-name adventlib System/IO/Advent.hs System/IO/Test.hs
    ar cqs src/libHSadventlib.a src/System/IO/*.o
    ghc --make src/MainTest.hs
    ghc --make -dynamic src/MainTest.hs -o src/MainTest_dyn

последние две строки проверяют, что я могу скомпилировать исполняемый двоичный файл и связать библиотеку как статически, так и динамически.

При чтении документов представляется возможным использовать -dynamic-too для объединения первых двух строк в одну гх c бег. Однако мне не удалось заставить это работать.

Следующая строка создает объектные файлы stati c и dynamici c, но не создает файл so:

 cd src; ghc -c --make -dynamic-too -fPIC -package-name adventlib System/IO/Advent.hs System/IO/Test.hs

Впоследствии я могу связать файл so с помощью gh c, но затем мне нужно добавить все зависимости пакета вручную, упуская при этом большую часть преимуществ использования --make

Если я удалю -c флаг, чтобы gh c запустил стадию связывания следующим образом

cd src; ghc --make -shared -dynamic-too -fPIC -package-name adventlib System/IO/Advent.hs System/IO/Test.hs -o libHSadventlib.a -dyno libHSadventlib-ghc8.6.5.so

Тогда, похоже, не удается связать библиотеку stati c (я думаю, она пытается связать ее как Dynami c но с использованием stati c объектов):

cd src; ghc --make -shared -dynamic-too -fPIC -package-name adventlib System/IO/Advent.hs System/IO/Test.hs -o libHSadventlib.a -dyno libHSadventlib-ghc8.6.5.so
[1 of 3] Compiling System.IO.Advent ( System/IO/Advent.hs, System/IO/Advent.o )
[2 of 3] Compiling System.IO.TestInternal ( System/IO/TestInternal.hs, System/IO/TestInternal.o )
[3 of 3] Compiling System.IO.Test   ( System/IO/Test.hs, System/IO/Test.o )
Linking libHSadventlib.a ...
/nix/store/0hr45a0pzlh51hhcgynmfjpzff9d3ddv-binutils-2.31.1/bin/ld: /nix/store/gdpi6mrz1wcgmvpnfm9i9la9lpsb8lag-unliftio-0.2.12/lib/ghc-8.6.5/x86_64-linux-ghc-8.6.5/unliftio-0.2.12-Au2Yw1nUjiS94bY0JG3imp/libHSunliftio-0.2.12-Au2Yw1nUjiS94bY0JG3imp.a(Environment.o): relocation R_X86_64_32S against undefined symbol `stg_ap_p_info' can not be used when making a shared object; recompile with -fPIC
/nix/store/0hr45a0pzlh51hhcgynmfjpzff9d3ddv-binutils-2.31.1/bin/ld: /nix/store/7dx9j6hiscwr1a2nq9bjj91p33s9nqgg-unliftio-core-0.1.2.0/lib/ghc-8.6.5/x86_64-linux-ghc-8.6.5/unliftio-core-0.1.2.0-DmlZdkLzX278vkyONsp8WQ/libHSunliftio-core-0.1.2.0-DmlZdkLzX278vkyONsp8WQ.a(Unlift.o): relocation R_X86_64_32S against `.text.unliftiozmcorezm0zi1zi2zi0zmDmlZZdkLzzX278vkyONsp8WQ_ControlziMonadziIOziUnlift_zdp1MonadUnliftIO_info' can not be used when making a shared object; recompile with -fPIC

... etc ...

Я что-то упустил или dynamic-too не работает для создания общих библиотек?

У меня есть полный рабочий эксперимент здесь , для справки.

...