60034


Ubuntu向けの自作アプリを作成しています。debパッケージで配布するので`DEBIAN/control`の`Depends:`に依存パッケージ情報を記述しておき、debパッケージをビルドしています。

私のアプリはOpenSSLを使用するので、`libssl`が必要なのですが、Ubuntu18におけるそれは`libssl1.0.0`(1.0.2g)で、Ubuntu19におけるそれは`libssl1.1`(1.1.1b)となっています。ここで問題なのは、「`libssl`」というパッケージ名ではなく、「`libssl1.0.0`」と「`libssl1.1`」というように、パッケージ名自体にバージョン番号が組み込まれており、これが意味するところは、libssl1.0とlibssl1.1は関係ない別のものとして、Ubuntu標準パッケージに収められていることです。

私のアプリは今までUbuntu16/18を対象としており、`Depends:
libssl1.0.0`のように定義されているため、これをUbuntu19にインストールしようとすると、依存パッケージが解決できないとしてエラーになります。できればUbuntu16/18およびそれ以降に対応できるパッケージを作りたいです。

この解決方法にはどのようなものがあるでしょうか？

  * `libssl1.0.0`または`libssl1.1`のどちらにも対応できる`Depends:`の書き方がある？
  * あきらめてlibssl1.1系用パッケージを別に作る
  * OpenSSLをスタティックリンクする
  * その他いいアイディア


CC BY-SA 4.0
2019-10-21T09:43:18.060
59849
2019-10-28T03:38:20.277
2019-10-21T12:17:35.323
3060
3337
question
ubuntu debian openssl
Ubuntu 向け自作パッケージで libssl を利用する際のバージョン指定について


ファイル名にバージョンを含まないシンボリックリンク`libssl.so`をリンクしてはいかがでしょうか。  
そのようなシンボリックリンクがない場合は自分で作ればよいと思います。

作り方については以下を参考にしてください。

【解決案】  
使用するlibsslを適当な名前にシンボリックリンク(libxxx.so)します。  
ロードモジュールを作成するとき、共有ライブラリ(libxxx.so)を相対パスで指定します。  
配布先の環境では、そのlibsslを適当なディレクトリ下のlibxxx.soにシンボリックリンクします。  
※ロードモジュールと同じディレクトリでよいと思います。  
実行時には共有ライブラリ(libxxx.so)のパスをLD_LIBRARY_PATHに指定すればいいと思います。

【具体的な手順】

[code]

    clang -shared -o libfunc.so func.c
    ln -s libfunc.so  libxxx.so
    LIBRARY_PATH=. clang main.c -lxxx
    LD_LIBRARY_PATH=. ./a.out
    
[/code]

※clangでなくgccでも同じです。

ldd a.outの結果です。

[code]

            linux-vdso.so.1 (0x00007fffcf1df000)
            libxxx.so => not found
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff9a6af0000)
            /lib64/ld-linux-x86-64.so.2 (0x00007ff9a7000000)
    
[/code]

【動作確認に使用したソース】  
func.c

[code]

    #include <stdio.h>
    #include "func.h"
    int func(){
        printf("Hello\n");
        return 0;
    }
    
[/code]

func.h

[code]

    int func(void);}
    
[/code]

main.c

[code]

    #include "func.h"
    int main(int argc, char *argv[]){
            (void)func();
            return 0;
    }
    
[/code]

【環境】  
OS:Ubuntu 18.04.3 LTS  
clang version 9.0.0 (trunk 362692) (llvm/trunk 362690)  
GNU ld (GNU Binutils for Ubuntu) 2.30

【その他】  
以下のページを参考にしました。

[Linux C/C++
自作ライブラリ作成環境の構築](http:////https://qiita.com/narupo/items/3166aee27b27ac3ce178)


CC BY-SA 4.0
2019-10-26T13:52:00.817
59994
2019-10-26T22:39:46.900
2019-10-26T22:39:46.900
35558
35558
59849
answer


共有ライブラリの依存関係は以下で済むはずですが。

[code]

    Depends: ${shlibs:Depends}
    
[/code]

ビルド時の依存関係は:

[code]

    Build-Depends: libssl-dev
    
[/code]

このように、`debian/control` としては OpenSSL バージョンを意識しなくても済みます。


CC BY-SA 4.0
2019-10-27T07:23:25.060
60011
2019-10-27T07:23:25.060
3061
59849
answer


自己回答です。コメントでいただいた内容を踏まえてまとめます。

  * Ubuntu18ではOpenSSL1.0が標準で、`libssl1.0.0`というパッケージ名。
  * Ubuntu19ではOpenSSL1.1が標準で、`libssl1.1`というパッケージ名。
  * 依存関係を解決したいだけなら、メタパッケージの`openssl`をインストールすれば、ディストロ毎の標準OpenSSLがインストールされる。
  * OpenSSL1.0とOpenSSL1.1では、APIが異なり、バイナリ互換性がなく、shared library を差し替えただけでは、恐らく動作しない。
  * ディストロ毎のパッケージリポジトリを分けることができるなら、`Depends: openssl`として、Ubuntuのバージョン毎に別のdebファイルを作成すると良い。
  * 単一のdebパッケージでUbuntu16～19に全対応したかったら、標準パッケージのOpenSSLをあきらめて、`libssl.a`と`libcrypto.a`をスタティックリンクする。

私のアプリでとった解決策は、上記最後のスタティックリンクする方法です。リンカオプションで`/usr/lib/x86_64-linux-
gnu/libssl.a /usr/lib/x86_64-linux-gnu/libcrypto.a
-ldl`の様にしました。`libdl.so`が必要なので、最後に`-ldl`を付けます。（最初ではなく最後に付けないと、エラーが出て悩まされるので注意）


CC BY-SA 4.0
2019-10-28T03:38:20.277
60034
2019-10-28T03:38:20.277
3337
59849
answer