本帖最后由 wateras1 于 2018-6-7 16:50 编辑
uci在ubuntu平台下的移植
这些就引用官方的操作步骤吧。
获取源代码:
git clone git://nbd.name/uci.git
转至源码目录(CMakeLists.txt所在的目录),并配置 build 为无Lua绑定:
cd uci/; cmake -D BUILD_LUA:BOOL=OFF .
make install
打开 /etc/ld.so.conf, 并把你安装的uci库添加到这里:
vi /etc/ld.so.conf
在 /etc/ld.so.conf 某处添加这一行
/usr/local/lib
以root执行 ldconfig 来执行 /etc/ld.so.conf 的变化
ldconfig
To compile your application you have to link it against the uci library. Append -luci in your Makefile: 编译您的应用程序,你必须在您的Makefile文件中附加-luci以链接uci库:
$(CC) test.o -o test -luci
以上步骤都是在root权限下运行,如果你以为按照上面步骤就解决了,那实际运行到make install基本就是如下网友的悲剧,其实我一开始也是遇到这个悲剧,google都没找到办法,不过还是最后自己解决了。
其实看log信息也就是bitfiled_set函数没有定义,可惜我一直没找到这个函数的定义也不知道是来自linux内核还是哪里的头文件,如果有好友知道可以补充,于是乎,我就直接自己实现算了。在blob.c文件里面加入
bool
uci_blob_diff(struct blob_attr **tb1, struct blob_attr **tb2,
const struct uci_blob_param_list *config, unsigned long *diff)
{
bool ret = false;
int i;
for (i = 0; i < config->n_params; i++) {
if (!tb1 && !tb2)
continue;
if (!!tb1 != !!tb2)
goto mark;
if (blob_len(tb1) != blob_len(tb2))
goto mark;
if (memcmp(tb1, tb2, blob_raw_len(tb1)) != 0)
goto mark;
continue;
mark:
ret = true;
if (diff)
bitfield_set(diff, i);
else
return ret;
}
return ret;
}
在这个函数定义前面加入
void bitfield_set(unsigned long *bitfield, unsigned int num)
{
memset(bitfield, (char)~0, num*sizeof(*bitfield));
}
接下里在创建下config文件mkdir -p /etc/config
vi一个test测试文件内容如下:test.abc=xxxxtest.abc.test_var='value'
root@wateras-virtual-machine:/etc/config# uci show test
test.abc=sdsds
test.abc.test_var='value'
root@wateras-virtual-machine:/etc/config# uci set test.abc='wateras'
root@wateras-virtual-machine:/etc/config# uci commit test
root@wateras-virtual-machine:/etc/config# uci show test
test.abc=wateras
test.abc.test_var='value'
root@wateras-virtual-machine:/etc/config#
就以上几步就解决了uci在ubuntu上面的移植,对于我们熟悉uci命令操作也方便不需要在openwrt平台下面测试,我们直接在电脑上面验证没有问题再放到op里面也方便,最近移植一些开源的软件,下载下来总是缺少各种依赖,于是乎又是神农百草般各种debug,没事就成为神农,死了就是倒霉鬼了。
此内容由EEWORLD论坛网友wateras1原创,如需转载或用于商业用途需征得作者同意并注明出处