Я хотел бы создать библиотеку, которая статически связывается с локальным .a
файлом.
Чтобы сделать его более конкретным, вот HPack package.yaml
, который создает двоичный файл phase2
, который статически связывается с cobj/libImpl.a
:
name: clashilator-model-phase2
version: 0
category: acme
dependencies:
- base
executables:
phase2:
main: phase2.hs
source-dirs: src
include-dirs: csrc
build-tools: hsc2hs
extra-libraries: stdc++
extra-lib-dirs: cobj
ghc-options:
-O3 -fPIC -pgml g++
-optl-Wl,--allow-multiple-definition
-optl-Wl,--whole-archive -optl-Wl,-Bstatic
-optl-Wl,-L./cobj -optl-Wl,-lImpl
-optl-Wl,-Bdynamic -optl-Wl,--no-whole-archive
Теперь, если я попытаюсь сделать то же самое с библиотекой, две вещи go неправильно:
name: clashilator-model-phase2
version: 0
category: acme
dependencies:
- base
library:
source-dirs: src
include-dirs: csrc
build-tools: hsc2hs
exposed-modules:
- Interface
extra-libraries: stdc++
extra-lib-dirs: cobj
ghc-options:
-O3 -fPIC -pgml g++
-optl-Wl,--allow-multiple-definition
-optl-Wl,--whole-archive -optl-Wl,-Bstatic
-optl-Wl,-L./cobj -optl-Wl,-lImpl
-optl-Wl,-Bdynamic -optl-Wl,--no-whole-archive
- * * * * * * * * * * * * * * * * * * * * *
library-dirs
: cobj
- это относительный путь, который не имеет смысла (поскольку ему нечего относиться). Вы можете создавать пути относительно самой базы данных пакетов, используя $ {pkgroot}
. (используйте --force
для переопределения) Предположительно, это можно обойти , написав пользовательский Setup.hs
.
- Если я последую вышеприведенному ответу или уберу флаг
extra-lib-dirs
, сборка, похоже, будет успешной, но, увы, полученный файл .a
не будет ссылаться на libImpl.a
:
$ nm .stack-work/dist/x86_64-linux/Cabal-3.0.1.0/build/libHSclashilator-model-phase2-0-Da0NUHx0OMlCviQdOLebNo.a |grep bar
U bar
Следовательно, попытка использовать полученную библиотеку из другого проекта Cabal / Stack в исполняемом файле приводит к сбою при связывании.