LoginSignup
4
5

More than 5 years have passed since last update.

OSXでcgoでフォルダ階層が一階層上にあるライブラリを指定するには

Last updated at Posted at 2015-02-23

背景

libtrusterdなるリポジトリを作って、こっそり活動していたら、
なんと! trusterdの作者の@matsumotory さんからtrusterd
リポジトリを移動して、こっちで開発しない?
(英語でのお誘いのため、一部意訳かも)

ということで、前々からSEO的に絶対有効だと思われるGo言語対応を
ほぼ、cgoでのqsortの例を見つけ、paiza.ioの枯れている版と思われる
goで動かせたので、これは行けると思い、早速作業。

1階層上のフォルダの共有ライブラリをリンク

goの例もexamplesというフォルダに入れることして、

├── libtrusterd.dylib
├── examples
│   └── trusterdGo.go

cgoの部分

// #cgo LDFLAGS: -L.. -ltrusterd

これで、go build は上手く行き、実行ファイルが出来るのです。

ところが

実行すると、

./trusterdGo 
dyld: Library not loaded: libtrusterd.dylib
  Referenced from: /Users/kjunichi/work/mruby/libtrusterd/examples/./trusterdGo
  Reason: image not found
Trace/BPT trap: 5

動かすには

install_name_toolというツールで、実行ファイルがリンクしている
ライブラリ名を書き換えることで、1階層上の共有ライブラリを実行時にロード
できるようになった。

install_name_tool -change libtrusterd.dylib ../libtrusterd.dylib trusterdGo

install_name_tool前

otool -L trusterdGo
trusterdGo:
    libtrusterd.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

install_name_tool後

otool -L trusterdGo
trusterdGo:
    ../libtrusterd.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

libtrusterdとは

mrubyで作られた高速なhttp2サーバーであるtrusterdを共有ライブラリ化することで、
Python、OCaml、Node.js、その他libffiが使える言語からこのtrusterdを
動かすことを可能にしたものです。

参考リンク

関連記事

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5