我正在将Microsoft Azure移植到OpenWrt(Atheros AR9330 rev 1 @ mips), 按照https://github.com/Azure/azure-iot-sdk-c/blob/master/doc/SDK_cross_compile_example.md和https://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),它搞乱了文件只是,我不知道如何写一个会递归寻找文件的脚本。
有人能给我一些线索或帮助吗?谢谢。
答案 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