すず☆彡日記@はてな

2015-07-17

dynamic link libraryを実行ファイルのそばに配置する

| 14:49

Windowsの場合EXEと同じ場所にDLLを置けば、PATHが通って無くてもそのDLLが動的リンクされます。

Macの場合はどうするかのメモ。

DYLD_LIBRARY_PATH や DYLD_FALLBACK_LIBRARY_PATH を指定する余地があるなら不要な話です。


例えばopenCVのdylibをリンクしようとしている場合、otoolでみると以下の様になります。

$ otool -L sample
sample:
	lib/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	lib/libopencv_imgcodecs.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

これを

$ install_name_tool \
  -change lib/libopencv_core.3.0.dylib @executable_path/libopencv_core.3.0.dylib \
  -change lib/libopencv_imgcodecs.3.0.dylib @executable_path/libopencv_imgcodecs.3.0.dylib \
  sample

$ otool -L sample
sample:
	@executable_path/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	@executable_path/libopencv_imgcodecs.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

とすることで「sample と同じ場所にある libopencv_*.dylib」になります。

・・・しかし上の場合は libopencv_imgcodecs.3.0.dylib が libopencv_core.3.0.dylib に依存しています。

$ otool -L libopencv_imgproc.3.0.dylib 
libopencv_imgproc.dylib:
	lib/libopencv_imgproc.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	lib/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)      #<=コレ
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

そこでこれらも再帰的に @executable_path に置き換えます。

$ install_name_tool \
  -change lib/libopencv_imgproc.3.0.dylib @executable_path/libopencv_imgproc.3.0.dylib \
  libopencv_imgproc.3.0.dylib

$ otool -L libopencv_imgproc.3.0.dylib
libopencv_imgproc.3.0.dylib:
	lib/libopencv_imgproc.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	@executable_path/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

再帰的に処理する部分が厄介なので「カレントディレクトリに集めておいてまとめて更新」するスクリプトを書きました。

https://gist.github.com/suzumura-ss/01d6e0f42234d3110ea1

2012-09-07

Ubuntu12でObj-Cを叩いてみる

| 04:47

多少癖があったのでメモ。

このあたりを参考に...

install

以下の2つ。Obj-CコンパイラとNSObjectのライブラリ

$ sudo apt-get install gobjc libgnustep-base-dev

コンパイル

以下のコードで実験。

#import <Cocoa/Cocoa.h>

@interface MyClass : NSObject
- (void) getMessage;
@end

@implementation MyClass
- (void) getMessage
{
  @try {
    NSLog(@"Hello");
    @throw [[NSException alloc] initWithName:@"myException" reason:@"myReason" userInfo:nil];
  }
  @catch (NSException* e) {
    NSLog(@"%@", e);
  }
}
@end

int main(int argc, char* argv[])
{
  id obj = [MyClass alloc];
  [obj getMessage];

  return 0;
}
$ gcc test.m -o test -lobjc -lgnustep-base \
 -I/usr/include/GNUstep/ \
 -fconstant-string-class=NSConstantString \
 -D_NATIVE_OBJC_EXCEPTIONS -fobjc-exceptions
  • -lgnustep-base : NSObject系列を使うために。
  • -fconstant-string-class=NSConstantString : @"string"と書くために。
  • -D_NATIVE_OBJC_EXCEPTIONS -fobjc-exceptions : @try/@catchを使うために。

2012-05-15

sakuraVPSにrubyを入れたらnet/httpsが使えなかった件

| 14:22

もちろん

$ sudo yum install openssl-devel

済みです。

が、/usr/lib64/pkgconfig/ に問題があって

$ pkg-config --libs libssl
-Wl,-z,relro -L/usr/lib6464 -lssl -lcrypto -ldl -lz

lib6464 って何よ…(´・ω・`)

libssl.pc, libcrypto.pc, openssl.pc が

libdir=${exec_prefix}/lib6464

になってました。

2012-05-12

corega の USB シリアルケーブルを Mac OS X でも使えるようにする - Lion版

| 18:34

corega の USB シリアルケーブルを Mac OS X でも使えるようにする | Weboo! Returns. さんの記事を参考に、

同じくAmazon.co.jp: corega CG-USBRS232R ケーブル: パソコン・周辺機器iMacに繋げようとしてみましたが…

$ sudo touch /System/Library/Extensions        # => 増えない
$ sudo kextcache -k /System/Library/Extensions # => -k オプションはLionでは使えない

以下のようにすると

$ sudo kextunload -bundle-id com.prolific.driver.PL2303
$ sudo kextload -bundle-id com.prolific.driver.PL2303
$ ls /dev/tty.usb*
/dev/tty.usbserial

認識しました。

参考にしたブログ記事にあるXMLですが

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
     :
  <key>IOKitPersonalities</key>
  <dict>
    <key>067B_2303</key>
    <dict>
      : (元々あるエントリ)
    </dict>

    <!-- corega CG-USBRS232R -->
    <key>07aa_002a</key>
    <dict>
      <key>CFBundleIdentifier</key>
      <string>com.prolific.driver.PL2303</string>
      <key>IOClass</key>
      <string>com_prolific_driver_PL2303</string>
      <key>IOProviderClass</key>
      <string>IOUSBInterface</string>
      <key>bConfigurationValue</key>
      <integer>1</integer>
      <key>bInterfaceNumber</key>
      <integer>0</integer>
      <key>idProduct</key>
      <integer>42</integer>
      <key>idVendor</key>
      <integer>1962</integer>
  </dict>
     :

この "07aa_002a" は

システム情報 - USB - ... - USB-Serial Controller D の

  • 0x002a : 製品ID
  • 0x07aa : 製造元ID

を連結したものです。

2012-03-08

LionにopenCVをいれてみる

| 21:03

id:tamakiii:20091125 さんの記事を参考にしながらインストールしようとしたのですが、多少状況が違うようなのでメモ。

一番の違いは「MacPorts が不要っぽい」という点でしょうか。

  • /usr/bin/xcodebuild のパスが合わないので修正
    • Xcode4.3 から Xcode の場所が変わったのでそれに対応。
$ sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/Contents/Developer/
  • OpenCV-2.3.1a.tar.bz2 を OpenCV-2.3.1/ へ展開して OpenCV_build/ を準備
$ tar jxf OpenCV-2.3.1a.tar.bz2
$ mkdir OpenCV_build
$ cd OpenCV_build
  • cmake で設定
    • C++コンパイラを/usr/bin/c++から/usr/bin/g++へ変更
      • `No matching constructor for initialization of 'cvflann::LshIndexParams'` のようなエラーが出るのでこれを抑制。
      • これだけはGUI版のcmakeでは指定できませんでした。GUIからEntryを追加しても消されてしまうのです。
    • libjpeg, libpng, libtiff をOpenCV付属のものを利用するように変更
      • シンボル _png_set_gray_1_2_4_to_8 が無い旨のエラーになるのでこれを抑制。libpngのバージョンチェックに失敗している様です。
$ cmake -D CMAKE_CXX_COMPILER:FILE_PATH=/usr/bin/g++ -D OPENCV_BUILD_3RDPARTY_LIBS:BOOL=YES ../OpenCV-2.3.1
  • make && make install
$ make
$ sudo make install

動作確認

| 23:38

動作確認コード。

#include <cv.h>
#include <highgui.h>

using namespace cv;

int main(int argc, char* argv[])
{
    VideoCapture cap(0);
    if(!cap.isOpened()) {
        return -1;
    }

    namedWindow("sample", CV_WINDOW_AUTOSIZE);
    for(;;) {
        Mat frame;
        cap >> frame;
        imshow("sample", frame);
        if(waitKey(30)>=0) break;
    }
    return 0;
}

そしてコンパイルと実行。

$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
$ g++ -O3 -Wall -o sample sample.cpp `pkg-config --cflags --libs opencv`
$ ./sample

動きました\(゚∀゚)/

pkg-configメモ

23:51

これのために MacPorts が要る・・・のかな? 検証できてません。

$ pkg-config --cflags --libs opencv
 -I/usr/local/include/opencv -I/usr/local/include \ 
 -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui \
 -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d \
 -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann