Arch Linux Android Studio cmake "OPENSSL_1.0.0 not found" を解決する

/usr/lib/libcrypto.so.1.0.0: version `OPENSSL_1.0.0' not found

Error:FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':project:externalNativeBuildCleanDebug'.
> Build command failed.
  Error while executing process ${HOME}/sdk/android-sdk-linux/cmake/3.6.3155560/bin/cmake with arguments {--build ${HOME}/Project/project/.externalNativeBuild/cmake/debug/armeabi --target clean}
  ${HOME}/sdk/android-sdk-linux/cmake/3.6.3155560/bin/cmake: /usr/lib/libcrypto.so.1.0.0: version `OPENSSL_1.0.0' not found (required by ${HOME}/sdk/android-sdk-linux/cmake/3.6.3155560/bin/cmake)
  ${HOME}/sdk/android-sdk-linux/cmake/3.6.3155560/bin/cmake: /usr/lib/libssl.so.1.0.0: version `OPENSSL_1.0.0' not found (required by ${HOME}/sdk/android-sdk-linux/cmake/3.6.3155560/bin/cmake)
  ${HOME}/sdk/android-sdk-linux/cmake/3.6.3155560/bin/cmake: /usr/lib/libssl.so.1.0.0: version `OPENSSL_1.0.1' not found (required by ${HOME}/sdk/android-sdk-linux/cmake/3.6.3155560/bin/cmake)


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

適当にアップデートしてたら遭遇してしまいました。

とりあえずぐぐると一番上にStack Overflow、さすが。

stackoverflow.com

この中ではopensslパッケージをダウングレードすれば良いと書かれてますが、個人的に嫌でした。

下の方までスクロールしていくと「studio.shを編集する」という回答があります。

これでも良かったんですが、Android Studioのアップデートでパッチを当てるたびにconflictが出るのもめんどくさそうなので、別の対処法を取りました。

対処法

opensslをビルドして専用のディレクトリにインストールする。起動時にLD_LIBRARY_PATHを指定する。

微妙といえば微妙ですが、Android StudioやArch Linuxのパッケージアップデートのたびに問題起こるよりマシな感があったので……。

1. libresslをダウンロードする。
2. インストールフォルダを指定してビルドする。
3. インストールする。ちょっと小細工する。
4. 起動時に `LD_LIBRARY_PREFIX` で専用ディレクトリを指定する。
5. (๑•̀ㅂ•́)و✧

1. libresslをダウンロードする。

https://www.libressl.org/

wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.5.4.tar.gz

2. インストールフォルダを指定してビルドする。

cmakeを使っているので./configureを使う場合は適宜読み替え。

tar xvf libressl-2.5.4.tar.gz
mkdir libressl-2.5.4-build && cd libressl-2.5.4-build
cmake -D CMAKE_INSTALL_PREFIX=${YOUR_INSTALL_DIRECTORY} ../libressl-2.5.4
make -j`nproc`

3. インストールする。ちょっと小細工する。

CMAKE_INSTALL_PREFIXをつけてるのでmake installすればインストールはできるんですが、

Android Studioで入るcmakelibXXX.so.1.0.0を探すようです。 インストールしても上記のシンボリックリンクは作られないので適当に作ります。

make install
cd ${YOUR_INSTALL_DIRECTORY}/lib
ln -s libssl.so{,.1.0.0}
ln -s libcrypto.so{,.1.0.0}
# libtlsは使わないのでスルー

4. 起動時に LD_LIBRARY_PREFIX で専用ディレクトリを指定する

自分の起動方法に合わせて読み替えて下さい。僕はDesktop Entryから起動するので、

vim ~/.local/share/applications/jetbrains-studio.desktop

ファイルの内容は以下ですが、${HOME}${YOUR_INSTALL_DIRECTORY} のようなシェル変数の書き方をしてる部分は実際のパスに置き換えて下さい

[Desktop Entry]
Version=1.0
Type=Application
Name=Android Studio
Icon=${HOME}/Tools/android-studio/bin/studio.png
Exec=env LD_LIBRARY_PATH=${YOUR_INSTALL_DIRECTORY}/lib "${HOME}/Tools/android-studio/bin/studio.sh" %f
Comment=Develop with pleasure!
Categories=Development;IDE;
Terminal=false
StartupWMClass=jetbrains-studio

Execのところでenv LD_LIBRARY_PATH=${YOUR_INSTALL_DIRECTORY} を指定してます。

これで解決しました。お疲れ様でした。

Rust: bindgenで生成したコードのdoctestがコケる

RustでCのラッパーライブラリを作ろうとしてたときに発生しました。

以下で対処

[lib]
doctest = false

Cargo.tomlに書き加える。

The Manifest Format

そもそもコメント形式が違うのになんでdoctestに引っかかってるのかはわかってないけどモチベがないのでこれでよしとする。

20170410 00:18 追記:

普通にbindgenにコメント生成しないようにするメソッドがありました

bindgen::Builder - Rust

Comments are copied verbatim without checking if they might be invalid · Issue #426 · servo/rust-bindgen · GitHub

    for fname in &files {
        let _ = bindgen::builder()
            .header(format!("{}/{}.h", &header_dir, &fname))
            .raw_line("pub use super::*;")
            .hide_type("max_align_t")
            .generate_comments(false)
            .clang_arg("-std=c11")
            .generate().unwrap()
            .write_to_file(Path::new(&out_dir).join(format!("{}.rs", &fname)));
    }

手元で作業してるものはこんな感じになりました。ドキュメントはちゃんと見ましょうということで、はい。

Rustで<T: std::ops::Sub> T - T の返り値

<T: std::ops::Sub> T - T の返り値

std::ops::Sub::Outputが返り値になる。

AddとかMulとか、Overloadable operatorsはそんな感じらしい

doc.rust-lang.org

Associated typesと一緒にやったときちょっと引っかかったのでした。 Rustはまだ数回ググらないと、自分の知識では目的までたどり着けないなあ。

たいして目的のないコードを載せると、こんな感じです。

trait Contains {
    type A: Copy + ops::Sub;
    type B: Copy + ops::Sub + convert::From<Self::A>;

    fn contains(&self, &Self::A, &Self::B) -> bool;
    fn first(&self) -> Self::A;
    fn last(&self) -> Self::B;
}

fn difference<C: Contains>(container: &C) -> <C::B as ops::Sub>::Output {
    container.last() - C::B::from(container.first())
}

お疲れ様でした。

Arch LinuxでAndroid Studioを使ってC++ supportのプロジェクトを作るときにやったこと

プロジェクト作成は省略。Hello from C++を表示するまでにやったこと。 Arch Linuxではプロジェクト作ってそのままだとGradle syncがCMake実行時にコケてしまったのでメモ。

libncurses

なんかlibncurses.so.5が見つからないと言われる。 ncurses は インストール済みなのに言われるので調べたらlibncurses.so.6が入ってるんですね。

なので symbolic link を貼って解決すればいいとのこと。

[SOLVED]Cannot find libncurses.so.5 / Newbie Corner / Arch Linux Forums

sudo ln -s /usr/lib/libncursesw.so.6 /usr/lib/libncurses.so.5

libtinfo

ncursesの解決はできたものの今度は libtinfo.so.5 が見つからないとのこと。

sudo pacman -Ss libtinfo なんて適当に調べても見つからない。 おとなしくググると、 AURにはあるらしい。

なのでyaourt -S libtinfoでインストール。/usr/libの下を確認するとlibtinfo.so.6がいることを確認

sudo ln -s /usr/lib/libtinfo.so.{6,5}

これでとりあえずはGradle syncがコケなくなってHello from C++が表示できました。

お疲れ様でした。

参考:

おまけ

いつものエミュレータが起動できないlibstdc++のアレ

追記: 2017/03/14現在、確認

SDKいくつで変わったのかはわかりませんが、soが移動してました。ので

mv $ANDROID_SDK_HOME/emulator/lib64/libstdc++/libstdc++.so.6{,.back}
ln -s /usr/lib/libstdc++.so $ANDROID_SDK_ROOT/emulator/lib64/libstdc++/libstdc++.so.6

↑こんな感じで。

↓では動きません。動きませんというか、ファイルがないのでコケるはず。

mv $ANDROID_SDK_HOME/tools/lib64/libstdc++/libstdc++.so.6{,.back}
ln -s /usr/lib/libstdc++.so $ANDROID_SDK_ROOT/tools/lib64/libstdc++/libstdc++.so.6

IntelliJ IDEA で Gradle Java のプロジェクトを作ったときのsrcフォルダの場所

普段Android Studioが勝手に作ってくれてよく忘れるので覚え書き。

  • IntelliJ IDEA 2016.3.2 Community Edition での説明です。

プロジェクト作成の流れ

Create New Project(もしくはメニューの New -> Project)を選択して

Gradle -> Java を選択

f:id:norikakip:20170108171649p:plain

GroupId にはパッケージ名、ArifactIdにはプロジェクト名を入れる

f:id:norikakip:20170108171913p:plain

GradleのJavaプラグインではプロジェクトのレイアウトが決められていて(もちろん変更は可能)、ソースフォルダは

が使われるようになっている。なのでここにフォルダを作ってソースファイルを入れないと、Gradleに設定を書いていない限り、syncするたびにソースフォルダとして指定しないといけなくなります。ちょっとハマりました。

第23章 Javaプラグイン

これでプロジェクトが始められるぞー٩( ‘ω’ )و ガンバル

フォルダを自分で作りたくない

プロジェクト作成時に Create directories… にチェックを入れればフォルダは勝手に作られます。

f:id:norikakip:20170108175854p:plain

よく読もうと思いました。終わり。

Visual Studio CodeでC/C++プログラムのデバッグをする時gdbが上手く動かない

f:id:norikakip:20160417054848p:plain なんだかブレークポイントで止まってくれない上に画像のようなメッセージが出る。

"warning: GDB: Failed to set controlling terminal: Operation not permitted\n"

色々と検索して当たりましたが簡潔に。

  1. ptrace_scope
    sudo sysctl -w kernel.yama.ptrace_scope=1
    解決せず。ハズレ

  2. gdb -window
    gtkでwindow出してたのでもしかしてと思い。(英語を読む気がない感)
    解決せず。ハズレ

  3. gcc -g
    これでした。
    普通にgdb使う時はデバッグシンボルなくてもブレークポイントで止まってくれるのに……
    おかげで妙にハマってしまいました。

お疲れ様でした。

EclipseでLogcatが消えた時にやったこと

www.adventar.org

24日目の記事です。ジャスト投稿!!!(ジャスト一週間遅刻)
23日目の記事はElixirのドキュメント環境を整える - 302 - あちらですでした(手前味噌)
25日目の記事はwebsearch.vimpr でサービス別コンテンツを即検索 - Qiitaです

EclipseでLogcatが消えた

会社ではEclipseからAndroid Studioへ移行中で[移行前|移行済み]のプロジェクトが混在しているのですが、移行前のものをいじっている時に遭遇したLinuxEclipseを使ってる時にLogcatの画面で何も表示されないという問題を解決したときのメモ

Linux gnome環境 Eclipse Luna

なんとバグを2つ踏んでました。GTKウインドウの描画が正しくないものと、Logcatの設定2つの問題でした。

GTKウインドウの描画設定

eclipse.iniを編集します

--- eclipse.ini.old  2015-12-31 23:46:51.619740843 +0900
+++ eclipse.ini.new   2015-12-31 23:47:02.763073854 +0900
@@ -12,9 +12,12 @@ org.eclipse.platform
 256m
 --launcher.defaultAction
 openFile
+--launcher.GTK_version
+2
 --launcher.appendVmargs
 -vmargs
 -Dosgi.requiredJavaVersion=1.7
--XX:MaxPermSize=256m
--Xms256m
--Xmx1024m
+-XX:MaxPermSize=1024m
+-Xms1024m
+-Xmx4096m
+

メモリ関係のもの適当にいじってますが、大事なのはGTKバージョンの指定です。

launcher.GTL_version
2

この2行を--launcher.appendVmargsの前に入れます。

Logcatの設定

stackoverflow.com

StackOverflowの回答を見て欲しいんですが、workspace内にある設定ファイルをいじります。
この回答の手順が良いと思います。 Application等の値は自分の環境で変わるようですが、僕の場合は正しく動いている現在こんな感じになりました。

logcat.view.colsize.Application=226
logcat.view.colsize.Level=54
logcat.view.colsize.PID=58
logcat.view.colsize.TID=58
logcat.view.colsize.Tag=280
logcat.view.colsize.Text=688
logcat.view.colsize.Time=162

ほんとに値がよくわかりませんがこの2つを設定しなおしてちゃんと動くようになりました。終わりです。