ラベル 64bit の投稿を表示しています。 すべての投稿を表示
ラベル 64bit の投稿を表示しています。 すべての投稿を表示

2017年1月8日日曜日

Debian 8.6 (jessie) に xrdp をインストールする

環境

Debian 8.6 (jessie)
LXDE
(gnome や cinnamon では、起動すらできなかったが、原因は未調査。)


手順

root ユーザで作業する前提とする。

# libxrandr-dev パッケージをインストールするのがミソ
aptitude -y install git libxrandr-dev

# 任意のディレクトリでビルド作業を行う
git clone --depth 1 -b v3.03 https://github.com/scarygliders/X11RDP-o-Matic.git
cd X11RDP-o-Matic
./X11rdp-o-matic.sh --justdoit

# パッケージがインストールされているか確認
dpkg -l xrdp x11rdp

# セッションマネージャを選択(LDXE を選択する)
./RDPsesconfig.sh


# 再起動後、 xrdp で以下のようなエラーが発生した。

Jan  7 22:28:41 record2 xrdp-sesman[583]: (583)(140136194672384)[ERROR] error opening pid file[/var/run/xrdp/xrdp-sesman.pid]: No such file or directory

# /var/run は、/run のシンボリックリンクとなっている。
# /run は、tmpfs で作成されるため、起動時に初期化されてしまう。
# したがって、起動時に作成するように設定を行う必要がある。

# PID ファイルの格納先を作成
tee /etc/tmpfiles.d/xrdp.conf <<'EOT'
d /run/xrdp 0755 root root
EOT


# xrdp を起動すると、さらに以下のようなエラーが発生する。
# これは、pid ファイルの作成先が、異なっているため。

Jan 08 11:06:30 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] starting xrdp-sesman with pid 11225
Jan 08 11:06:30 record2 systemd[1]: PID file /var/run/xrdp-sesman.pid not readable (yet?) after start.
Jan 08 11:06:30 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] listening to port 3350 on 127.0.0.1
Jan 08 11:08:00 record2 systemd[1]: xrdp-sesman.service start operation timed out. Terminating.
Jan 08 11:08:00 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] shutting down sesman 1
Jan 08 11:08:00 record2 xrdp-sesman[11225]: (11225)(140003619026688)[DEBUG] Closed socket 7 (AF_INET 127.0.0.1:3350)
Jan 08 11:08:00 record2 systemd[1]: Failed to start xrdp session manager.

# /lib/systemd/system/xrdp.service ファイルを以下のように修正
#   pid ファイルの場所を修正
#   存在しないディレクトリの読み込み行をコメントアウト

PIDFile=/var/run/xrdp/xrdp.pid
#EnvironmentFile=-/etc/sysconfig/xrdp
#EnvironmentFile=-/etc/default/xrdp


# /lib/systemd/system/xrdp-sesman.service ファイルを以下のように修正
#   pid ファイルの場所を修正
#   存在しないディレクトリの読み込み行をコメントアウト

PIDFile=/var/run/xrdp/xrdp-sesman.pid
#EnvironmentFile=-/etc/sysconfig/xrdp
#EnvironmentFile=-/etc/default/xrdp


systemctl daemon-reload
systemctl enable xrdp
systemctl start xrdp

# xrdp が起動したことを確認
systemctl status xrdp

# 再起動し、正常に xrdp が起動することを確認する。
reboot



2012年9月17日月曜日

Windows 64bit 用の ffmpeg をビルド

はじめに

ちょっと悶絶したくて、Ubuntu 上のクロスコンパイル環境で、Windows 64bit 用の ffmpeg をビルドしてみる。
ライセンスの関係で、配布できないものになるので、注意。

ビルド方法は、偉大なる先人である、「Linux日記: MinGWでx264、ffmpegをビルド」ページをマルパクリ・・・。ありがたや、ありがたや。

make に付いている -j6 は、並列ビルドするオプション。コア数 * 1.5 がいいとかなんとか・・・。場合によって、undefined などのエラーが発生するので注意。
CFLAGS などに指定してある -pipe は、テンポラリファイルではなく、パイプを利用して、メモリを多く使用する代わりに、コンパイルを高速化するオプション。

なお、ビルド手順については、思考錯誤などの手戻りで、ビルド順があやしいので、近々に検証する予定。

【2012/09/19】 ビルド手順の検証完了。やっぱり間違っていた。3回ぐらいやらないと、まともにならないな。手順を見直して、不要なライブラリが削れた。
ついでに、パッチをすべてアップロードした。パッチを当てるときは、解凍したディレクトリに cd してから「patch -p0 < パッチファイル」のようにする。
Blogger のせいなのか、タブ文字がスペース文字に置き換わってしまい、パッチをアップロードせざるを得なかった。

利用したソース

zlib (zlib-1.2.7.tar.bz2)
bzip2 (bzip2-1.0.6.tar.gz)
XZ Utils (xz-5.0.4.tar.bz2)
SDL (SDL-1.2.15.tar.gz)
gpac (gpac-0.5.0.tar.gz)
ffmpeg
ffms2
x264
OpenSSL (openssl-1.0.1c.tar.gz)
libpng (libpng-1.5.12.tar.gz)
libtiff (tiff-3.9.6.tar.gz)
libjpeg-turbo (libjpeg-turbo-1.2.1.tar.gz)
lcms2 (lcms2-2.3.tar.gz)
lame (lame-3.99.5.tar.gz)
faac (faac-1.28.tar.bz2)
libogg (libogg-1.3.0.tar.gz)
libvorbis (libvorbis-1.3.3.tar.gz)
libtheora (libtheora-1.1.1.tar.bz2)
libspeex (speex-1.2rc1.tar.gz)
opencore-amr (opencore-amr-0.1.2.tar.gz)
openjpeg (openjpeg_v1_4_sources_r697.tgz)
xvidcore (xvidcore-1.3.2.tar.bz2)
gsm (gsm-1.0.13.tar.gz)
rtmpdump
libvpx (libvpx-v1.1.0.tar.bz2)
libfdk-aac

未完遂のライブラリ

orc (orc-0.4.16.tar.gz)
libschroedinger (schroedinger-1.0.11.tar.gz)



依存ライブラリのビルド(1週目)

zlib

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
CC=x86_64-w64-mingw32-gcc \
AR=x86_64-w64-mingw32-ar \
RANLIB=x86_64-w64-mingw32-ranlib \
LDSHAREDLIBC="" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=zlib-mingw-w64-x86-64 \
--pkgversion="1:1.2.7.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

bzip2

まず、このパッチを当ててから以下の作業を行う。
make libbz2.a
sudo install -m 644 bzlib.h /usr/x86_64-w64-mingw32/include
sudo install -m 644 libbz2.a /usr/x86_64-w64-mingw32/lib

XZ Utils

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=xz-utils-mingw-w64-x86-64 \
--pkgversion="1:5.0.4.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

SDL

gpac の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libsdl-mingw-w64-x86-64 \
--pkgversion="1:1.2.15.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

gpac

本家ソースの最新版をコンパイルしてみた。
gpac の依存ライブラリ。
そのままで、Ubuntu 上の MinGW 環境で、静的ライブラリをクロスコンパイルしようとしたら、ひどい有様だった。仕方がないのでパッチを当てたら、パッチファイルが 1300 行を超えた・・・・
パッチは、MinGW 環境での、静的ライブラリ生成専用。動的ライブラリの生成は、できないので注意。
はじめに上記のパッチを当ててから作業を開始する。
パッケージの情報が記述されているが、余計なお世話なのでリネーム
mv gpac.spec gpac.spec_org

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure  --prefix=/usr/x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- --cpu=x86_64 \
--extra-cflags="-pipe"

make -j6

sudo checkinstall --pkgname=libgpac-mingw-w64-x86-64 \
--pkgversion="1:0.5.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
sudo make install install-lib


ビルド(1週目)

ffmpeg

各ライブラリは、相互依存するので、はじめは最小構成で FFmpeg をビルドする。
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
commit 83438a0db3c61f06979d1c4159e5c85d52eda488
Date:   Mon Sep 17 00:40:55 2012 +0200
2週目のためにこのパッチを当てる。1週目では必要ないが、ここで当てておく。
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --enable-gpl \
--enable-version3 --enable-nonfree \
--enable-postproc --enable-memalign-hack \
--enable-runtime-cpudetect --enable-avisynth \
--enable-w32threads --cross-prefix=x86_64-w64-mingw32- \
--target-os=mingw32 --arch=x86_64 --cpu=x86_64 \
--extra-cflags="-pipe" --extra-cxxflags="-pipe"

make -j6

sudo checkinstall --pkgname=ffmpeg-mingw-w64-x86-64 \
--pkgversion="1:20120909.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ffms2

svn checkout http://ffmpegsource.googlecode.com/svn/trunk/ ffms2
リビジョン: 712

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --host=x86_64-w64-mingw32 \
--disable-silent-rules --enable-dependency-tracking \
--disable-shared --enable-static

make -j6

sudo checkinstall --pkgname=ffms2-mingw-w64-x86-64 \
--pkgversion="1:712.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make install-strip

x264

git clone git://git.videolan.org/x264.git x264
commit 198a7ea13ccb727d4ea24b29f5da9b0292387309
Date:   Thu Aug 16 13:40:32 2012 -0700
まず、このパッチを当ててから以下の作業を行う。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-win32thread \
--enable-static \
--extra-cflags="-pipe -O2" \
--extra-ldflags="-lws2_32"


platform:      X86_64
system:        WINDOWS
cli:           yes
libx264:       internal
shared:        no
static:        yes
asm:           yes
interlaced:    yes
avs:           yes
lavf:          yes
ffms:          yes
gpac:          yes
gpl:           yes
thread:        win32
filters:       resize crop select_every 
debug:         no
gprof:         no
strip:         no
PIC:           no
visualize:     no
bit depth:     8
chroma format: all


make -j6

sudo checkinstall --pkgname=libx264-mingw-w64-x86-64 \
--pkgversion="1:20120816.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default


依存ライブラリのビルド(2週目)

OpenSSL

make に 並列ビルドオプション(-j)をつけると、undefined エラーとなる。
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./Configure --prefix=/usr/x86_64-w64-mingw32 \
--cross-compile-prefix=x86_64-w64-mingw32- \
mingw64 threads zlib no-shared

make

sudo checkinstall --pkgname=openssl-mingw-w64-x86-64 \
--pkgversion="1:1.0.1c.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libpng

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libpng-mingw-w64-x86-64 \
--pkgversion="1:1.5.12.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libtiff

openjpeg の依存ライブラリ
4.0.2 でやってみたら、openjpeg で認識してくれなかったので、3.9.6 にした。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libtiff-mingw-w64-x86-64 \
--pkgversion="1:3.9.6.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libjpeg-turbo

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libjpeg-turbo-mingw-w64-x86-64 \
--pkgversion="1:1.2.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

lcms2

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=liblcms2-mingw-w64-x86-64 \
--pkgversion="1:2.3.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

lame

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared \
--enable-nasm

make -j6

sudo checkinstall --pkgname=lame-mingw-w64-x86-64 \
--pkgversion="1:3.99.5.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

faac

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared --without-mp4v2

make -j6

sudo checkinstall --pkgname=faac-mingw-w64-x86-64 \
--pkgversion="1:1.28.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libogg

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libogg-mingw-w64-x86-64 \
--pkgversion="1:1.3.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libvorbis

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libvorbis-mingw-w64-x86-64 \
--pkgversion="1:1.3.3.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libtheora

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libtheora-mingw-w64-x86-64 \
--pkgversion="1:1.1.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libspeex

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared --enable-sse

make -j6

sudo checkinstall --pkgname=libspeex-mingw-w64-x86-64 \
--pkgversion="1:1.2rc1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

opencore-amr

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libopencore-amr-mingw-w64-x86-64 \
--pkgversion="1:0.1.2.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

openjpeg

make -j6 だと、エラーとなる。早すぎたんだ・・・
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
LIBS="-lpng" \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

----------------------------------------------
           your configuration

--with-png-libraries: yes
libpng header       : yes
--enable-tiff       : yes
libtiff header      : yes
--enable-lcms2      : yes
lcms2 header        : yes
lcms2 version       : 2.3
--enable-lcms1      : no
lcms1 header        : no
lcms1 version       : 
--enable-jpwl       : no
--enable-jp3d       : no
--enable-shared     : no
----------------------------------------------

make

sudo checkinstall --pkgname=libopenjpeg-mingw-w64-x86-64 \
--pkgversion="1:1.4.r697.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

xvidcore

以下のようなエラーとなるので

GCC4 から、無くなったオプション
  C: ./decoder.c
cc1: エラー: 認識できないコマンドラインオプション ‘-mno-cygwin’ です

原因は、-DWINDOWS オプション。
以下のコマンドで、生成されたオブジェクトファイルの中身をのぞくと、関数名の先頭にアンダースコアが付いている。
x86_64-w64-mingw32-nm build/generic/\=build/utils/x86_asm/cpuid.obj
  L: xvidcore.a
  L: xvidcore.dll
Creating library file: xvidcore.dll.a
xvid.obj:xvid.c:(.text+0xe0): undefined reference to `check_cpu_features'
xvid.obj:xvid.c:(.text+0x65c): undefined reference to `emms_mmx'
xvid.obj:xvid.c:(.text+0x673): undefined reference to `fdct_mmx_skal'
xvid.obj:xvid.c:(.text+0x67a): undefined reference to `idct_mmx'
...
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12c1): undefined reference to `check_cpu_features'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12d8): undefined reference to `lum_8x8_mmx'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12e3): undefined reference to `consim_mmx'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12fb): undefined reference to `consim_sse2'
collect2: ld はステータス 1 で終了しました
make: *** [xvidcore.dll] エラー 1

まず、このパッチを当ててから以下の作業を行う。

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
AFLAGS="-DNO_PREFIX" \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=libxvidcore-mingw-w64-x86-64 \
--pkgversion="1:1.3.2.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

gsm

まず、このパッチを当ててから以下の作業を行う。

make -j6

sudo checkinstall --pkgname=libgsm-mingw-w64-x86-64 \
--pkgversion="1:1.0.13.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make gsminstall

rtmpdump

git clone git://git.ffmpeg.org/rtmpdump
commit e0056c51cc1710c9a44d2a2c4e2f344fa9cabcf4
Date:   Tue Jul 24 17:17:26 2012 +0200

make SYS=mingw SHARED= CROSS_COMPILE=x86_64-w64-mingw32- \
OPT="-O2" XLIBS="-lcrypt32" \
prefix=/usr/x86_64-w64-mingw32

sudo checkinstall --pkgname=rtmpdump-mingw-w64-x86-64 \
--pkgversion="1:$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make SYS=mingw SHARED= CROSS_COMPILE=x86_64-w64-mingw32- \
OPT="-O2" XLIBS="-lcrypt32" \
install prefix=/usr/x86_64-w64-mingw32

libvpx

pthread がインストールされていない場合、win32thread を利用するようになる。 その時に、windows.h が import されずに「不明な型名 CRITICAL_SECTION」エラーとなるため、このパッチを当てる。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
CROSS=x86_64-w64-mingw32- \
./configure --target=x86_64-win64-gcc --prefix=/usr/x86_64-w64-mingw32 \
--disable-shared \
--disable-examples

make -j6

sudo checkinstall --pkgname=libvpx-mingw-w64-x86-64 \
--pkgversion="1:1.1.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libfdk-aac

今回は、GitHub からソースを取得した。
git clone https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac

fdk-aac$ git log
commit 226601a8d9bce81455e161a0e26051d2f22c5d7a
Date:   Mon Mar 18 16:23:17 2013 +0200

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared --enable-static --enable-fast-install

make -j6

sudo checkinstall --pkgname=libfdk-aac-mingw-w64-x86-64 \
--pkgversion="1:0.1.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ビルド(2週目)

ffmpeg

make clean

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- --target-os=mingw32 \
--arch=x86_64 --cpu=x86_64 --enable-gpl --enable-version3 \
--enable-nonfree --enable-postproc \
--enable-memalign-hack --enable-runtime-cpudetect \
--enable-avisynth --disable-debug \
--extra-libs="-lws2_32 -lgdi32 -lwinmm"  --enable-w32threads \
--enable-zlib --enable-bzlib --enable-libmp3lame \
--enable-libfaac --enable-libvorbis --enable-libtheora \
--enable-libspeex --enable-libopencore-amrnb \
--enable-libopencore-amrwb --enable-libopenjpeg \
--enable-libxvid --enable-libgsm \
--enable-librtmp \
--enable-libx264 \
--enable-libfdk-aac \
--extra-cflags="-pipe" --extra-cxxflags="-pipe"

make -j6

sudo checkinstall --pkgname=ffmpeg-mingw-w64-x86-64 \
--pkgversion="1:20120909.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ffms2

make clean

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --host=x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=ffms2-mingw-w64-x86-64 \
--pkgversion="1:712.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make install-strip

x264

configure で、ライブラリを指定しまくらないと、ffms2 が有効にならない。自動的に設定してくれないものなのか・・・
config.log を頼りに、不足のライブラリをせっせと追加したが、心が折れそうになった。
make clean

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-win32thread --enable-static --enable-strip \
--extra-cflags="-pipe -O2" \
--extra-ldflags="-lx264 -lfdk-aac -lfaac -lgsm -lmp3lame -lopencore-amrnb -lopencore-amrwb -lopenjpeg -ltheoraenc -ltheoradec -lspeex -lvorbis -lvorbisenc -logg -lxvidcore -lrtmp -lssl -lcrypto -lws2_32 -lgdi32 -lwinmm"

make -j6

sudo checkinstall --pkgname=libx264-mingw-w64-x86-64 \
--pkgversion="1:20120816.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default


実行ファイルのチェック

ビルドした実行ファイルが、DLL 依存になっていないかをチェック。
$ x86_64-w64-mingw32-objdump -p x264.exe | grep 'DLL Name'
 DLL Name: ADVAPI32.dll
 DLL Name: AVIFIL32.dll
 DLL Name: GDI32.dll
 DLL Name: KERNEL32.dll
 DLL Name: msvcrt.dll
 DLL Name: msvcrt.dll
 DLL Name: USER32.dll
 DLL Name: WINMM.dll
 DLL Name: WS2_32.dll

$ x86_64-w64-mingw32-objdump -p ffmpeg.exe | grep 'DLL Name'
 DLL Name: ADVAPI32.dll
 DLL Name: AVICAP32.dll
 DLL Name: AVIFIL32.dll
 DLL Name: GDI32.dll
 DLL Name: KERNEL32.dll
 DLL Name: msvcrt.dll
 DLL Name: msvcrt.dll
 DLL Name: PSAPI.DLL
 DLL Name: SHELL32.dll
 DLL Name: USER32.dll
 DLL Name: WINMM.dll
 DLL Name: WS2_32.dll


備忘録

ビルド中に発生した問題の解決方法を備忘録として残しておく。

configure の先頭行のシェルに -x オプションを付け、デバッグ出力する。

configu.log をみて、依存ライブラリチェック処理のエラーなどを確認する。

undefined reference が、発生した場合は、/usr/x86_64-w64-mingw32 ディレクトリで、
fgrep -r --exclude-dir="bin" --exclude-dir="sbin" 未定義ラベル名 *
のようにして、探す。
ライブラリが絞り込めたら、
x86_64-w64-mingw32-nm lib/libtheoraenc.a | grep th_encode_flushheader
のようにすると、
U th_encode_flushheader
0000000000004d70 T th_encode_flushheader
のように表示される。U は未定義、T などになっているものを探す。


2012年9月9日日曜日

Ubuntu 上に、Windows 64bit 用のクロスコンパイル環境を構築

はじめに

Ubuntu 上に、Windows 64bit 用のクロスコンパイル環境を構築したくなった。
Windows 7 に VMware をインストールし、その上で Ubuntu を動作させることとする。

動作環境

Windows 7 Professional 64bit SP1
VMware Playre 5 (VMware-player-5.0.0-812388.exe)
Ubuntu 12.04 LTS Alternative amd64 (ubuntu-12.04.1-alternate-amd64.iso)

環境構築

VMware は、インストール済みとする。

仮想マシンの作成

VMware を起動し、「新規仮想マシンの作成」を行う。
以下、設定した値を列挙する。
インストール元:「後で OS をインストール」を選択。
※ 「インストーラ ディスク イメージ ファイル」を選択すると、「簡易インストール」モードになってしまい、デスクトップ環境がインストールされない。通常インストールするには、「後で OS をインストール」を選択する必要がある。

ゲストOS:「Linux」
バージョン:「Ubuntu 64ビット」
仮想マシン名:「Ubuntu64」
場所:任意
ディスク最大サイズ(GB):「50」
「仮想ディスクを単一ファイルとして格納」

「ハードウェアをカスタマイズ」ボタンを押下。
メモリ:「2048」MB
プロセッサ:「4」
新規 CD/DVD(IDE):接続「ISO イメージ ファイルを使用する」、「ubuntu-12.04.1-alternate-amd64.iso」を指定する。

Ubuntu のインストール

仮想マシンを起動すると、Ubuntu のインストールが始まる。
適宜、値を設定する。
インストール中、ウィンドウ下部に、VMware Tools のインストールを促すメッセージが出るが、インストール完了まで放置しておく。

ディスクのパーティショニングについは、「ガイド - ディスク全体を使い、LVM をセットアップする」を選択した。この項目は、Alternate 版のみで表示される項目(なはず)。

ポコペンッ と Ubuntu が起動したら、インストール中に設定した、ユーザーでログインする。

アップデート

端末を起動
※ 10.04 を使っていたので、12.04 では UI 周りがガラッと変わっていて、よ~わからん状態・・・。最初は、端末の起動をするだけで、悶絶してしまったw。
左上の「Dash ホーム」をクリックして、「端末」と入力して検索するか、「Dash ホーム」アイコンを右クリックして、「アプリケーション」を選択、「インストール済み」の中から、探し出す。
む~・・・慣れの問題か・・・。

sudo aptitude update
sudo aptitude full-upgrade

VMware Tools のインストール

ウィンドウ下に、ずっと出ていた「ツールのインストール」ボタンを押下。
ドライブがマウントされ、「VMwareTools-9.2.0-799703.tar.gz」ファイルが表示される。
ファイルを右クリックして、「展開...」を選択。
展開先を適宜選択して、「展開」ボタンを押下。

「端末」のコマンドラインで、展開先の「vmware-tools-distrib」ディレクトリに移動。
sudo ./vmware-install.pl

すべてデフォルト値のまま Enter

再起動する。
sudo reboot now

MinGW-w64 をインストール

端末を起動

sudo aptitude install mingw-w64 g++-mingw-w64 binutils-mingw-w64

以下の新規パッケージがインストールされます:
  binutils-mingw-w64 binutils-mingw-w64-i686{a} binutils-mingw-w64-x86-64{a} g++-4.6{a} g++-mingw-w64 g++-mingw-w64-i686{a} 
  g++-mingw-w64-x86-64{a} gcc-mingw-w64{a} gcc-mingw-w64-base{a} gcc-mingw-w64-i686{a} gcc-mingw-w64-x86-64{a} libstdc++6-4.6-dev{a} 
  mingw-w64 mingw-w64-dev{a} 
0 個のパッケージを更新、 14 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
80.5 M バイトのアーカイブを取得する必要があります。 展開後に 341 M バイトのディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] 

インストールが完了すると、「/usr/bin」に「x86_64-w64-mingw32-c++」などのコマンドが増えている。
「/usr/x86_64-w64-mingw32」にクロスコンパイル用のヘッダや、ライブラリが格納されている。

インストールしたバージョン

binutils-mingw-w64          2.22-2ubuntu1+1
binutils-mingw-w64-i686     2.22-2ubuntu1+1
binutils-mingw-w64-x86-64   2.22-2ubuntu1+1
g++-mingw-w64               4.6.3-1ubuntu5+5ubuntu1
g++-mingw-w64-i686          4.6.3-1ubuntu5+5ubuntu1
g++-mingw-w64-x86-64        4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64               4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-base          4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-i686          4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-x86-64        4.6.3-1ubuntu5+5ubuntu1
mingw-w64                   2.0.1-1
mingw-w64-dev               2.0.1-1


その他ツールのインストール

nasm および yasm

両方ともアセンブラ。ビルド時に必要になることがある。両方入れておけば、問題ない。

sudo aptitude install nasm yasm

構成管理ツール

git および subversion をインストール。

sudo aptitude install git subversion

checkinstall

make install などで、インストールすると、パッケージ管理の対象外となってしまうが、checkinstall を使用することで、rpm や dep などのパッケージを作成でき、パッケージ管理可能となる。

sudo aptitude install checkinstall

autoreconf

autogen.sh の中で使ってたりする。

sudo aptitude install dh-autoreconf

ccache

コンパイル結果をキャッシュして、2回目以降の実行時間を短縮するためのツール。1回しかコンパイルしないのならば、必要ない。

sudo aptitude install ccache

ccache g++ hoge.cpp のように実行する方法や、 PATH の先頭に /usr/lib/ccache/ ディレクトリを追加して、 g++ などのリンクファイル(リンク先は、ccache)を実行する方法などがある。
/usr/lib/ccache/ ディレクトリの実行リンクファイルは、ccache のインストール時に、自動的に更新されるようだ。

実際には以下のようにする。
PATH=/usr/lib/ccache:${PATH} make

実行結果のキャッシュ先は、デフォルトで「${HOME}/.ccache」ディレクトリになっている。
変更する場合は、「CCACHE_DIR」環境変数に設定する。

最大キャッシュサイズのデフォルト値は、1GBになっている。必要に応じて、最大値を以下のように設定できる。10 GByte に増やした。設定は、キャッシュディレクトリごとに、行う必要がある。

CCACHE_DIR=${HOME}/.ccache-mingw64 \
ccache -M 10G

設定した値は、以下のように確認できる。

CCACHE_DIR=${HOME}/.ccache-mingw64 \
ccache -s

cache directory                     /home/user1/.ccache-mingw64
cache hit (direct)                    34
cache hit (preprocessed)               0
cache miss                            42
called for link                       18
preprocessor error                     1
no input file                          1
files in cache                        99
cache size                           564 Kbytes
max cache size                      10.0 Gbytes

「CCACHE_DIR」は、デフォルト値のディレクトリを利用する場合、いちいち指定する必要はない。または、export しておいてもよい。

ビルド

実際にビルドを行ってみる。

zlib

zlib のページからソース(zlib-1.2.7.tar.bz2)をダウンロードしてくる。
適当なディレクトリでソースを展開。

tar jxvf zlib-1.2.7.tar.bz2
cd zlib-1.2.7

CC=x86_64-w64-mingw32-gcc \
AR=x86_64-w64-mingw32-ar \
RANLIB=x86_64-w64-mingw32-ranlib \
LDSHAREDLIBC="" \
./configure --prefix=/usr/x86_64-w64-mingw32

PATH=/usr/lib/ccache:${PATH} \
CCACHE_DIR=${HOME}/.ccache-mingw64 \
make

sudo checkinstall --pkgname=zlib-mingw-w64-x86-64 \
--pkgversion="1:1.2.7.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

完了

アンインストールする場合は、「dpkg -r zlib-mingw-w64-x86-64」とする。






2011年12月30日金曜日

サウンド設定パネルを開くコマンド

C:\Windows\System32\rundll32.exe Shell32.dll,Control_RunDLL mmsys.cpl,,0
本当は、自動で、再生デバイスの規定値を変更したかったのだが、断念。

2010年11月13日土曜日

EDIROL FA-66 ドライバのインストールでハマッた

FA-66 ドライバの再インストールをしようとして、ちょっとハマッたので、備忘録として書き残す。

検証環境
  • Windows Vista Business (64ビット) SP2
  • EDIROL FA-66
  • IEEE1394 拡張ボード(Texas Instruments 製チップ)

インストールしたバージョンは、EDIROL FA-66 Driver Ver.1.0.6 for Windows Vista 64ビット版 (2008.03.25 公開)(FA66_Vis64Drv106J.zip)。

再インストールなので、zip ファイルを解凍し、その中の UnInstall.exe を実行する。
再起動後、setup.exe を実行する。手順通りに進め、FA-66 の電源を入れるところまで進める。
ここからが重要。
FA-66 の電源を入れる前に、FA-66 背面の「SAMPLE RATE」スイッチを”44.1”または”48”に設定する。”96”または”192”に設定しておくと、「FA-66 を使用する準備をしています。しばらくお待ちください。」から進まなくなる。場合によっては、強制リセットで再起動してしまう。
マニュアルにも、インストール手順にもそれらしい記述は無いので、環境依存なのか・・・

2010年10月31日日曜日

Eclipse CDT と MinGW (64ビット環境)で JNI のデバッグ

ふと、Eclipse で JNI 呼び出し DLL のデバッグがしたくなった。
つまんない事で嵌ったので、備忘録として書いておく。

検証環境:
  • Windows Vista Business (64ビット) SP2
  • Eclipse classic 3.6.1(64ビット) Build id: M20100909-0800
  • Eclipse CDT 7.0.1.201009141542
  • JDK 1.6.0_16(64ビット)
  • MinGW-w64 (mingw-w64-bin_i686-mingw_20100702_sezero.zip)
  • GDB (x86_64-w64-mingw32-gdb-7.1.90.20100730.zip)
  • Make (make-3.82-20100827.zip)

以前に、CDT の設定をして、うまく動いていたと思ったのに、久しぶりに Eclipse を起動したら、MinGW を認識してくれなった。CDT のアップデートを行ったからだろうか?
しょうがないので、サポート外Toolchain から MinGW を選択した。path に MinGW/bin が設定されていれば、デフォルトの include ディレクトリや lib ディレクトリは自動的に設定されるようだ。
まあ、ここら辺の調査は宿題としておこう。

まあ、何事にも共通するが、初めてやるものは、最小限の状態から試すことが大事。

JNI で Java ソースと C++ のソースを作成済みとする。
プロジェクトは、Java と C++ で分ける必要がある。Java プロジェクトには、JNI インターフェースを作成するソースを格納。これは、そのままテスト駆動用とする。C++ プロジェクトには、JNI インターフェースのヘッダファイルと、ヘッダに定義されている関数の実装を記述したソースを格納。

C++ プロジェクトの設定

C++ プロジェクトのプロパティを開く
「C/C++ Build」-「Settings」で「Tool Settings」タブを開く

「GCC C++ Compiler」で以下を設定
  • 「Preprocessor」の「Defined symbols(-D)」に”_JNI_IMPLEMENTATION_”を追加。これは、jni.h の中に定義されている。未設定でも動いたが、ヘッダの該当箇所あたりに記述してあるメソッドを利用するときは設定する必要があるのかもしれない。
  • 「Includes」の「Include paths(-I)」に JDK をインストールしたディレクトリの include と include/win32 を追加。
  • 「Debugging」の「Debug Level」を”Default(-g)”に設定。

「All options」を見るとこんな感じ
-D_JNI_IMPLEMENTATION_ -I"C:\appli\Java\jdk1.6\include" -I"C:\appli\Java\jdk1.6\include\win32" -O2 -g -Wall -c -fmessage-length=0


「MinGW C++ Linker」で以下を設定
  • 「Miscellaneous」の「Linker flags」に”-static”と”--kill-at”を追加。static は、静的リンクをしたい場合につける。kill-at はシンボルの後ろに @ を付けたくないときに付ける。両方とも無くてもかまわない。たぶん。
  • 「Shared Library Settings」の「Shared(-shared)」チェックボックスをチェック

「All options」を見るとこんな感じ
-static --kill-at -shared


「Settings」画面の「Build Artifact」タブで以下を設定
  • 「Artifact Type」を”Shared Library”を設定。ただ、この設定がどこに影響があるのか不明。
  • 「Artifact name」を”${ProjName}”に設定。出力ファイルのベースファイル名になる。
  • 「Artifact extension」を”dll”に設定。出力ファイルの拡張子になる
  • 「Output prefix」を空にする。出力ファイル名の先頭に付加される。

以上で C++ プロジェクトへの設定は完了
ビルドすると、Default ディレクトリに dll ファイルが生成されるはず。

Java デバッグの設定
  • DLL 読み込みのために以下のいずれかのように DLL のディレクトリを設定する。
    • 「VM arguments」に”-Djava.library.path=../hello-jni/Default”のように指定。
    • 「Environment」に”PATH”を追加して、”../hello-jni/Default”のように指定。


C++ アタッチデバッグの設定
  • C++ プロジェクトをクリックして、選択状態にする。
  • 「Run」メニューから「Debug Configurations...」を選択。
  • 「C/C++ Attach to Application」 を右クリックして、コンテキストメニューから「New」を選択。
  • 作成されたデバッグ設定をクリック。
  • 「Main」タブの「C/C++ Application」が”Default\ DLL ファイル名”、「Project」がC++ プロジェクト名になっていることを確認。
  • 「Close」ボタンを押す。

デバッグ開始


デバッグを開始する手順は次のようにする。
  • Javaのソースにブレイクポイントを設定。ただし、 System.loadLibrary で 作成した DLL のロード後の場所に設定すること。
  • Java のデバッグを開始。
  • C++ のデバッグを開始。アタッチするプロセス ID を設定するダイアログが開くので、上で実行したプロセス(javaw.exe)の ID を tasklist コマンドか、タスクマネージャで調べて入力する。javaw.exe プロセスは、eclipse 本体もあるので、間違って eclipse 本体のプロセスを指定しないこと。
  • C++ ソースにブレイクポイントを設定する。ここ重要、必ず C++ デバッグ開始直後の状態(GDB が起動して、一時停止の状態)でブレイクポイントを設定すること。ブレイクポイントを解除しなくても無効にして有効にすれば問題ない。ブレイクポイントのマークをよく見ると、有効な場合は、丸の上にチェックが付いている。無効な場合には、丸だけ。さらに、ソース上のブレイクポイント行に!マークが付き”Breakpoint attribute problem: installation failed”と表示される。
  • C++ デバッグを再開(Resume(F8))する。再開後に C++ のブレイクポイントの設定はできない。C++ のブレイクポイントで一時停止した状態にならないとブレイクポイントの設定はできない。
  • Java デバッグを再開すると C++ のブレイクポイントで停止する。はず。


いろいろやってると、eclipse が反応しなくなるときがある。そんなときは、GDB のプロセスが残ってる場合があるので、taskkill コマンドかタスクマネージャから gdb.exe プロセスを停止するといい。

2010年7月16日金曜日

Eclipse CDT と MinGW(64bit版)でコンパイル

Eclipse CDT と MinGW(64bit版)でコンパイルをしてみたくなったので、やってみた。

■確認した環境

AMD Phenom(tm) II X4 955 3.20GHz
Windows Vista Business SP2 64bit

JDK 1.6.0_16  64bit
MinGW(64bit版)(mingw-w64-bin_i686-mingw_20100702_sezero.zip)
Eclipse Classic 3.6.0 64bit(eclipse-SDK-3.6-win32-x86_64.zip)
C/C++ Development Tools 7.0.0.201006141710

  • 間違いの元その1:MinGW は、元から 32bit 版が入っていて(C:\MinGW)、後から 64bit 版を入れた(C:\MinGW64)
    CDT は C:\MinGW にMinGW がインストールされていると、Path に設定されいるかは、関係なく、このディレクトリの GCC を使用してしまう。よって、32bit 版を、C:\MinGW86 にリネームした。
  • 間違いの元その2:環境変数の Path に、MinGW のパスを設定していない。
    CDT は、C:\MinGW にMingGW がインストールされていない場合は、環境変数の Path に設定された、パスから GCC を探して利用する。よって、Windows の「システムプロパティ」-「環境変数」で”Path”に”C:\MinGW64\bin”を追加した。
    GCC のパスは、Eclipse の設定で「C/C++」-「Build」-「Environment」などに設定しても、だめだった。