交叉编译libwebsockets

Complex Cross compiling example

Here are step by step instructions for cross-building the external projects needed for lws with lwsws + mbedtls as an example.

In the example, my toolchain lives in <tool_chain_file>/compile_tools/toolchain-aarch64_armv8-a_gcc-4.8-linaro_glibc-2.19 and is named arm-openwrt-linux-muslgnueabi. So you will need to adapt those to where your toolchain lives and its name where you see them here.

Likewise I do all this in /tmp but it has no special meaning, you can adapt that to somewhere else.

All "foreign" cross-built binaries are sent into /tmp/cross so they cannot be confused for 'native' x86_64 stuff on your host machine in /usr/[local/]....

Prepare the cmake toolchain file

1) cd /tmp

2) wget -O mytoolchainfile https://raw.githubusercontent.com/warmcat/libwebsockets/master/contrib/cross-arm-linux-gnueabihf.cmake

3) Edit /tmp/mytoolchainfile adapting CROSS_PATH, CMAKE_C_COMPILER and CMAKE_CXX_COMPILER to reflect your toolchain install dir and path to your toolchain C and C++ compilers respectively. For my case:

set(CROSS_PATH <tool_chain_file>/compile_tools/toolchain-aarch64_armv8-a_gcc-4.8-linaro_glibc-2.19/)

set(CMAKE_C_COMPILER "${CROSS_PATH}/bin/arm-openwrt-linux-muslgnueabi-gcc")

set(CMAKE_CXX_COMPILER "${CROSS_PATH}/bin/arm-openwrt-linux-muslgnueabi-g++")

libsockets:::

cmake .. -DCMAKE_INSTALL_PREFIX:PATH=<tool_chain_file>/compile_tools/toolchain-aarch64_armv8-a_gcc-4.8-linaro_glibc-2.19 \

    -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake \

    -DLWS_WITHOUT_EXTENSIONS=1 -DLWS_WITH_SSL=0 \

    -DLWS_WITH_ZIP_FOPS=0 -DLWS_WITH_ZLIB=0

lib/libmbedtls:::

cmake .. -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake -DCMAKE_INSTALL_PREFIX:PATH=<tool_chain_file>/compile_tools/toolchain-aarch64_armv8-a_gcc-4.8-linaro_glibc-2.19 -DCMAKE_BUILD_TYPE=RELEASE -DUSE_SHARED_MBEDTLS_LIBRARY=1

libsockets:::

cmake .. -DCMAKE_TOOLCHAIN_FILE=<tool_chain_file>/compile_tools/toolchain-aarch64_armv8-a_gcc-4.8-linaro_glibc-2.19 \

-DCMAKE_INSTALL_PREFIX:PATH=<tool_chain_file>/compile_tools/toolchain-aarch64_armv8-a_gcc-4.8-linaro_glibc-2.19 \

-DLWS_WITH_LWSWS=1 \

-DLWS_WITH_MBEDTLS=1 \

-DLWS_MBEDTLS_LIBRARIES="../../mbedtls-2.11.0/build/library/libmbedtls.so" \

-DLWS_MBEDTLS_INCLUDE_DIRS=../../mbedtls-2.11.0/include/mbedtls \

1/4: Building libuv cross:

1) export PATH=<tool_chain_file>/compile_tools/toolchain-aarch64_armv8-a_gcc-4.8-linaro_glibc-2.19/bin:$PATH

2) cd /tmp 

###mkdir cross we will put the cross-built libs in /tmp/cross

3) git clone https://github.com/libuv/libuv.git ##get libuv

4) cd libuv

5) ./autogen.sh

6) ./configure --host=aarch64-openwrt-linux-gnu --prefix=/tmp/cross

7) make && make install this will install to /tmp/cross/...

8) file /tmp/cross/lib/libuv.so.1.0.0 Check it's really built for ARM

/tmp/cross/lib/libuv.so.1.0.0: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, not stripped

2/4: Building zlib cross

1) cd /tmp

2) git clone https://github.com/madler/zlib.git

3) cd /tmp/zlib

4) CC=aarch64-openwrt-linux-gnu-gcc ./configure --prefix=/tmp/cross

5) make && make install

6) file /tmp/cross/lib/libz.so.1.2.11 This is just to confirm we built an ARM lib as expected

/tmp/cross/lib/libz.so.1.2.11: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, not stripped

3/4: Building mbedtls cross

1) cd /tmp

2) git clone https://github.com/ARMmbed/mbedtls.git

3) cd mbedtls ; mkdir build ; cd build

3) cmake .. -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake -DCMAKE_INSTALL_PREFIX:PATH=/tmp/cross -DCMAKE_BUILD_TYPE=RELEASE -DUSE_SHARED_MBEDTLS_LIBRARY=1

## mbedtls also uses cmake, so you can simply reuse the toolchain file you used for libwebsockets. That is why you shouldn't put project-specific options in the toolchain file, it should just describe the toolchain.

4) make && make install

5) file /tmp/cross/lib/libmbedcrypto.so.2.6.0

/tmp/cross/lib/libmbedcrypto.so.2.13.1: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, not stripped

4/4: Building libwebsockets with everything

1) cd /tmp

2) git clone ssh://git@github.com/warmcat/libwebsockets

3) cd libwebsockets ; mkdir build ; cd build

4) (this is all one line on the commandline)

cmake .. -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake \

-DCMAKE_INSTALL_PREFIX:PATH=/tmp/cross \

-DLWS_WITH_LWSWS=1 \

-DLWS_WITH_MBEDTLS=1 \

-DLWS_MBEDTLS_LIBRARIES="/tmp/cross/lib/libmbedcrypto.so;/tmp/cross/lib/libmbedtls.so;/tmp/cross/lib/libmbedx509.so" \

-DLWS_MBEDTLS_INCLUDE_DIRS=/tmp/cross/include \

-DLWS_LIBUV_LIBRARIES=/tmp/cross/lib/libuv.so \

-DLWS_LIBUV_INCLUDE_DIRS=/tmp/cross/include \

-DLWS_ZLIB_LIBRARIES=/tmp/cross/lib/libz.so \

-DLWS_ZLIB_INCLUDE_DIRS=/tmp/cross/include

3) make && make install

4) file /tmp/cross/lib/libwebsockets.so

/tmp/cross/lib/libwebsockets.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, not stripped

5) aarch64-openwrt-linux-objdump -p /tmp/cross/lib/libwebsockets.so | grep NEEDED

## Confirm that the lws library was linked against everything we expect (libm / libc are provided by your toolchain)

  NEEDED              libmbedtls.so

  NEEDED              libuv.so.1

  NEEDED              libm.so.6

  NEEDED              libgcc_s.so.1

  NEEDED              libc.so.6

You will also find the lws test apps in /tmp/cross/bin... to run lws on the target you will need to copy the related things from /tmp/cross... all the .so from /tmp/cross/lib and anything from /tmp/cross/bin you want.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容