link もっと前
   2019年 1月 22日 -
      2019年 1月 13日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

Cocos2d-x 再び

以前 Cocos2d-x をビルドして(2017年 6月 30日の日記参照)、Linux で動くサンプルプログラムをビルドしました。あの時は結局、ゲームは作らずじまいでした。懲りずに、今回は Android 向けにビルドします。

その前にまず Linux 向けにビルドします。簡単かと思ったら、めちゃくちゃハマりました……。

ビルドできない Cocos2d-x

公式ドキュメント(リンク)に載っている通りの手順を試すと、下記のようなエラーが出ます。

Cocos2d-x のビルドエラー
$ git clone https://github.com/cocos2d/cocos2d-x
$ cd cocos2d-x/


$ git submodule update --init
Submodule path 'tests/cpp-tests/Resources/ccs-res': checked out '5d65db4c5f18c0df1305ff32b076425ab228cc4a'
Submodule path 'tools/bindings-generator': checked out '2aa9b21f11bf514ca80f243b21750e8c7c28f05e'
Submodule path 'tools/cocos2d-console': checked out '643f423415c62a1b610549323c4bf5499683baab'
Submodule path 'web': checked out 'e79acd062363818af809c51804083a5989a9aedc'


$ ./download-deps.py
=======================================================
==> Prepare to download external libraries!
==> version file doesn't exist
==> Ready to download 'v3-deps-156.zip' from 'https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/archive/v3-deps-156.zip'
(...snip...)
==> Would you like to save 'v3-deps-156.zip'? So you don't have to download it later. [Yes/no]: Yes


$ cd build/
$ mkdir linux-build
$ cd linux-build/


$ cmake ../../
-- The C compiler identification is GNU 8.2.0
-- The CXX compiler identification is GNU 8.2.0
-- Check for working C compiler: /usr/lib/ccache/cc
-- Check for working C compiler: /usr/lib/ccache/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
(...snip...)
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/katsuhiro/share/projects/oss/cocos2d-x/build/linux-build


$ make
[  0%] Building CXX object engine/external/unzip/CMakeFiles/ext_unzip.dir/ioapi.cpp.o
[  0%] Building CXX object engine/external/unzip/CMakeFiles/ext_unzip.dir/unzip.cpp.o
[  0%] Building CXX object engine/external/unzip/CMakeFiles/ext_unzip.dir/ioapi_mem.cpp.o
[  1%] Linking CXX static library ../../../lib/libext_unzip.a
(...snip...)
[ 84%] Built target jscocos2d
[ 84%] Building CXX object engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/Classes/AppDelegate.cpp.o
[ 84%] Building CXX object engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/Classes/HelloWorldScene.cpp.o
[ 84%] Building CXX object engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/proj.linux/main.cpp.o
[ 84%] Linking CXX executable ../../../bin/Debug/cpp-empty-test/cpp-empty-test
/usr/bin/ld: ../../../../../external/freetype2/prebuilt/linux/64-bit/libfreetype.a(ftbase.linux64.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC
(...snip...)
/usr/bin/ld: ../../../../../external/freetype2/prebuilt/linux/64-bit/libfreetype.a(ftbitmap.linux64.o): relocation R_X86_64_32S against `.rodata' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
make[2]: *** [engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/build.make:153: bin/Debug/cpp-empty-test/cpp-empty-test] Error 1
make[1]: *** [CMakeFiles/Makefile2:1362: engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

エラーで指摘されている freetype2/prebuilt/linux/64-bit/libfreetype.a は、download-deps.py がダウンロードしてきた v3-deps-156.zip に含まれているスタティックライブラリです。recompile with -fPIC と言われても、自分でビルドしたものではないので、何もできません。そんなこと言われても困る。

困った挙句に Cocos2d-x の issue list(リンク)に辿りつきました。議論を見ると cocos2d-x-3rd-party-libs-src リポジトリの build.sh でライブラリが作れるみたいです。うえ〜、そんなの知らんがな。

Cocos2d-x の依存ライブラリビルド
$ git clone https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src
$ cd cocos2d-x-3rd-party-libs-src/build/

$ ./build.sh -p=linux --libs=freetype --arch=x86_64 --mode=release

$ cp linux/freetype/prebuilt/x86_64/libfreetype.a ../../cocos2d-x/external/freetype2/prebuilt/linux/64-bit/libfreetype.a

依存ライブラリを自前でビルドして置き換えることで、無事に Cocos2d-x のコンパイルが通りました。

Cocos2d-x のゲームプロジェクトは簡単に作れた

心配だったゲームプロジェクトの作り方は以前と同じ2017年 7月 2日の日記参照)でした。こちらはハマらなくて本当に良かったです。

生成されたゲームプロジェクトの中に proj.android という名前のディレクトリが作成されます。Android Studio で proj.android を開けば後は勝手に Gradle がビルドしてくれるはずです。

ゲームプロジェクトのトップ階層
$ ls
CMakeLists.txt  Resources  proj.android  proj.linux
Classes         cocos2d    proj.ios_mac  proj.win32

Linux 向けにビルドしたいときは、以前と同じ手順で OK です。同じコードで Android も Linux も対応できて便利ですよね。

[編集者: すずき]
[更新: 2019年 1月 20日 00:16]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

家の PC 性能表、更新

昔(2017年 5月 2日の日記参照)作った我が家の PC の Passmark スコア表に、Ryzen 7 デスクトップ(2018年 12月 1日の日記参照)も加えました。

  • (速)
  • デスクトップ AMD Ryzen7 2700: 2005, 14985, 8C16T, 65W
  • 旧デスクトップ AMD A10-7800: 1537, 5069, 4C4T, 65W
  • ノート Intel Core i5 2450M: 1404, 3404, 2C4T, 35W
  • サーバ Intel Pentium J4205: 899, 2394, 4C4T, 10W
  • 旧サーバ Intel Atom D2700: 349, 840, 2C4T, 10W
  • サブマシン Intel Atom D525: 284, 701, 2C4T, 13W
  • (遅)

2年前は Ryzen 7 の 8コアを欲しいなと思いつつも、何に使うか疑問に思っていましたが、Linux のビルドに最適だということがわかって、とても役に立っております。買って良かった。

[編集者: すずき]
[更新: 2019年 1月 14日 02:08]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

ROCK64 と Tinker Board の U-Boot 設定メモ

ROCK64 の話へのリンク一覧。

完全に自分のためのメモですが、ROCK64 と Tinker Board で使用している U-Boot の distro boot の設定ファイル(extlinux.conf)を貼っておきます。

ROCK64

オリジナルのファイルに linux-next の起動用設定(label kernel-next の部分)を追加しました。

ROCK64 の extlinux.conf

menu title select kernel

label kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524
    kernel /boot/vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524
    initrd /boot/initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
    devicetreedir /boot/dtbs/4.4.132-1075-rockchip-ayufan-ga83beded8524
    append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=linux-root rootwait rootfstype=ext4

label kernel-next
    kernel /boot/Image
    initrd /boot/initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
    fdt /boot/rk3328-rock64.dtb
    append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=linux-root rootwait rootfstype=ext4

label kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524-memtest
    kernel /boot/vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524
    initrd /boot/initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
    devicetreedir /boot/dtbs/4.4.132-1075-rockchip-ayufan-ga83beded8524
    append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=linux-root rootwait rootfstype=ext4 memtest
ROCK64 のカーネル更新
クロスコンパイル用マシンにて実行

$ cd linux-next
$ scp arch/arm64/boot/Image arch/arm64/boot/dts/rockchip/rk3328-rock64.dtb 192.168.1.xxx:~/


Rock64 にて実行

$ sudo cp Image /boot/ ; sudo cp rk3328-rock64.dtb /boot/ ; sync ; sudo reboot

CPU が AArch64 なので生成されるイメージファイルは Image です。デバイスツリーは rk3328-rock64.dtb です。ネットワーク経由で ROCK64 のユーザ(なんでもよいですが)のホームディレクトリにコピーし、ボード側で /boot にコピーして使っています。また initrd はオリジナルのものを拝借しています。

1行目の menu title select kernel が結構大事で、この行を書いておくと U-Boot がカーネルを起動する際に下記のような選択肢が表示されます。

U-Boot の menu
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
1433 bytes read in 28 ms (49.8 KiB/s)
select kernel
1:      kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524
2:      kernel-next
3:      kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524-memtest
Enter choice: 

この設定はとにかくボードから SD カードの抜き差しをやりたくない一心でできています。

  • オリジナルのカーネル(選択肢 1番)と linux-next カーネル(選択肢 2番)を簡単に切り替えられる
  • 何もしないときは安全サイドに倒れる(=時間切れで選択肢 1番が勝手に選ばれる)

普段は boot メニューで 2番を選び linux-next カーネルを起動します。もし起動しないカーネルを書き込んでしまったり、ネットワークが死んでいるカーネルを書き込んでしまい、カーネルの更新ができなくなったときは、リブートし 1番を選び元々書かれていたカーネルを起動して復旧させます。

何も選択せず放置すると 1番が勝手に選ばれますので、おかしくなったら電源を ON/OFF して放置すれば、必ずオリジナルのカーネルが起動します。ボードが少し遠くに置いてあって、AC 電源 ON/OFF から U-Boot の選択肢タイムアウトまでの間にキー入力ができないので、このような設定にしています……。

Tinker Board

Tinker Board の設定も同じ思想で作っています。

Tinker Board の extlinux.conf

# cat /boot/extlinux/extlinux.conf
menu title select kernel

label kernel-4.4
    kernel /zImage
    fdt /rk3288-miniarm.dtb
    append  earlyprintk console=ttyS1,115200n8 root=/dev/mmcblk0p2 rw init=/sbin/init

label kernel-next
    kernel /linux-next
    fdt /rk3288-tinker.dtb
    append  earlyprintk console=ttyS1,115200n8 root=/dev/mmcblk0p2 rw init=/sbin/init
ROCK64 のカーネル更新
クロスコンパイル用マシンにて実行

$ linux-next
$ scp arch/arm/boot/zImage arch/arm/boot/dts/rk3288-tinker.dtb 192.168.1.xxx:~/


Tinker Board にて実行

# cp /home/katsuhiro/zImage /boot/linux-next; cp /home/katsuhiro/rk3288-tinker.dtb /boot/; sync; reboot

ROCK64 との違いは CPU が AArch32 なので生成されるイメージファイルは zImage であることと、デバイスツリーは rk3288-tinker.dtb であることでしょうか。

カーネルをネットワーク経由で更新する点は同じですが、zImage というファイル名だと元々存在するカーネルと被っているので、リネームしています。

[編集者: すずき]
[更新: 2019年 1月 13日 21:44]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2019年 1月 22日 -
      2019年 1月 13日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 1/20 00:16

カレンダー

<2019>
<<<01>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント 5件

  • link 18年12月11日
    すずき 「確認いただいてありがとうございます。直っ...」
    (更新:12/27 00:22)
  • link 18年12月11日
    T4 「再現しませんね\n\n確かに、過去にそう...」
    (更新:12/25 12:45)
  • link 18年12月11日
    すずき 「失礼しました。Rock64 の方は、\n...」
    (更新:12/22 02:10)
  • link 18年12月11日
    T4 「私は、Tinker Board を持って...」
    (更新:12/21 10:14)
  • link 18年12月11日
    すずき 「> 但し、これもう一年以上前の話で...」
    (更新:12/19 11:54)

最近の記事 3件

link もっとみる
  • link 19年01月18日
    すずき 「[Cocos2d-x 再び] 以前 Cocos2d-x をビルドし...」
    (更新:01/20 00:16)
  • link 19年01月14日
    すずき 「[家の PC 性能表、更新] 昔(2017年 5月 2日の日記参照...」
    (更新:01/14 02:08)
  • link 19年01月13日
    すずき 「[ROCK64 と Tinker Board の U-Boot] ...」
    (更新:01/13 21:44)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報