用于Microsoft Asure交叉编译的CMake链接路径替换

时间:2017-07-13 12:22:42

标签: azure cmake

我正在将Microsoft Azure移植到OpenWrt(Atheros AR9330 rev 1 @ mips), 按照https://github.com/Azure/azure-iot-sdk-c/blob/master/doc/SDK_cross_compile_example.mdhttps://github.com/Azure/azure-iot-sdk-c/issues/58

中的步骤操作

但是我遇到了Azure的CMake脚本的错误:    libcurl将通过默认路径链接,例如:

在文件中umqtt / samples / mqtt_client_sample / CMakeFiles / mqtt_client_sample.dir / link.txt

.... -lcurl /home/gaiger/openwrt-cc/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib/libssl.so  /home/gaiger/openwrt-cc/staging_dir/target-   \\
mips_34kc_uClibc-0.9.33.2/usr/lib/libcrypto.so -lpthread -lm -lrt -luuid -Wl,-rpath

很明显libcurl和libuuid已被默认系统路径而不是目标系统库路径采用(但openssl路径是目标)。

此错误已报告给Microsoft Azure团队https://github.com/Azure/iot-edge/issues/119,但目前尚未修复。

我发现如果我将-lcurl和-luuid替换为真实存在的位置(-lcurl - > home / gaiger / openwrt-cc / staging_dir / target-mips_34kc_uClibc-0.9.33.2 / usr / lib / libcurl。所以,对于-luuid),编译将被传递。但手动替换是一项艰苦的工作(因为有很多link.txt文件等待修改),需要再次进行下次编译。

我试图修改我的平台文件mips_34kc.cmake,以添加该行(在https://github.com/Azure/iot-edge/issues/119的上一篇文章中提到)

SET(CMAKE_EXE_LINKER_FLAGS "-Lhome/gaiger/openwrt-cc/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib/libcurl.so" CACHE STRING "" FORCE)
SET(MAKE_SHARED_LINKER_FLAGS "-Lhome/gaiger/openwrt-cc/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib/libcurl.so" CACHE STRING "" FORCE)
SET(CMAKE_C_FLAGS "-Lhome/gaiger/openwrt-cc/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib/libcurl.so" CACHE STRING "" FORCE)

但是link.txt没有改变。

我试着写一个脚本来替换-lcurl作为home / gaiger / openwrt-cc / staging_dir / target-mips_34kc_uClibc-0.9.33.2 / usr / lib / libcurl.so(使用sed),它搞乱了文件只是,我不知道如何写一个会递归寻找文件的脚本。

有人能给我一些线索或帮助吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我编写了一个shell脚本来绕过这个bug。

# bin/bash
#Power by Gaiger Chen 撰也垓恪, to fix azure sdk error in linking stage

echo Back up file as link.txt in the same folders

find -name link.txt -exec cp {} {}.bak -f \
#find -name link.txt -exec rm {}.bak -f \;
#find . -ipath "*link.txt" -type f  -exec cp {} {}.bak \;
#find . -ipath "*link.txt" -type f  -exec rm {}.bak \;

FOUND_LINKINK_TXT=$(find -name link.txt)

OPENWRT_LIB_PATH=""

echo "$FOUND_LINKINK_TXT" | while read LINE_CONTENT
do
    if [ -z "$OPENWRT_LIB_PATH" ]; then
    OPENWRT_LIB_PATH=$(sed -rn 's/.* (.*)libssl.so .*/\1/p' "$LINE_CONTENT")
    echo "$OPENWRT_LIB_PATH"
   fi

   echo fixing file: "$LINE_CONTENT".
   sed -i "s|-lcurl|$OPENWRT_LIB_PATH/libcurl.so|g" "$LINE_CONTENT"
   sed -i "s|-luuid|$OPENWRT_LIB_PATH/libuuid.so|" "$LINE_CONTENT"
done # while read LINE_CONTENT


FILE_NUM=$(echo "$FOUND_LINKINK_TXT" | wc -l)
echo "$FILE_NUM" files have been fixed.

我的博主可以找到更多细节:    http://gaiger-programming.blogspot.tw/2017/07/build-and-exploit-microsoft-azure-sdk.html