Статическая ссылка на локальный файл `.a` - PullRequest
2 голосов
/ 03 мая 2020

Я хотел бы создать библиотеку, которая статически связывается с локальным .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
  1. * * * * * * * * * * * * * * * * * * * * * library-dirs: cobj - это относительный путь, который не имеет смысла (поскольку ему нечего относиться). Вы можете создавать пути относительно самой базы данных пакетов, используя $ {pkgroot}. (используйте --force для переопределения)

    Предположительно, это можно обойти , написав пользовательский Setup.hs.

  2. Если я последую вышеприведенному ответу или уберу флаг 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 в исполняемом файле приводит к сбою при связывании.

...