我的openwrt学习笔记(三十三):Openwrt 之lua 在ubuntu中的测试

来源:互联网 发布:网络推广平台找推网 编辑:程序博客网 时间:2024/06/05 19:09

我的openwrt学习笔记(三十三):Openwrt之lua 在ubuntu中的测试

Lua[1]  是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto IerusalimschyWaldemarCeles Luiz Henrique de Figueiredo所组成并于1993年开发。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。

 

编译

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ make linux

cd src && make linux

make[1]: Entering directory `/home/linux/linux_c/lua/lua-5.1.5/src'

make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"

make[2]: Entering directory `/home/linux/linux_c/lua/lua-5.1.5/src'

gcc -o lua  lua.o liblua.a -lm -Wl,-E -ldl -lreadline -lhistory -lncurses

/usr/bin/ld: cannot find -lreadline

/usr/bin/ld: cannot find -lhistory

collect2: ld returned 1 exit status

make[2]: *** [lua] Error 1

make[2]: Leaving directory `/home/linux/linux_c/lua/lua-5.1.5/src'

make[1]: *** [linux] Error 2

make[1]: Leaving directory `/home/linux/linux_c/lua/lua-5.1.5/src'

make: *** [linux] Error 2

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ ldconfig -p | grep readline

/sbin/ldconfig.real: relative path `|' used to build cache

 

linux@ubuntu:~/linux_c/lua/lua-5.1.5$sudo apt-get install libreadline5

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ sudo apt-get install libreadline-dev

Reading package lists... Done

Building dependency tree      

Reading state information... Done

The following extra packages will be installed:

  libreadline6-dev

The following NEW packages will be installed:

  libreadline-dev libreadline6-dev

0 upgraded, 2 newly installed, 0 to remove and 623 not upgraded.

Need to get 250 kB of archives.

After this operation, 637 kB of additional disk space will be used.

Do you want to continue [Y/n]? y

Get:1 http://cn.archive.ubuntu.com/ubuntu/ precise/main libreadline6-dev i386 6.2-8 [249 kB]

Get:2 http://cn.archive.ubuntu.com/ubuntu/ precise/main libreadline-dev i386 6.2-8 [932 B]

Fetched 250 kB in 0s (975 kB/s)     

Selecting previously unselected package libreadline6-dev.

(Reading database ... 149096 files and directories currently installed.)

Unpacking libreadline6-dev (from .../libreadline6-dev_6.2-8_i386.deb) ...

Selecting previously unselected package libreadline-dev.

Unpacking libreadline-dev (from .../libreadline-dev_6.2-8_i386.deb) ...

Processing triggers for install-info ...

Setting up libreadline6-dev (6.2-8) ...

Setting up libreadline-dev (6.2-8) ...

 

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ make linux

cd src && make linux

make[1]: Entering directory `/home/linux/linux_c/lua/lua-5.1.5/src'

make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"

make[2]: Entering directory `/home/linux/linux_c/lua/lua-5.1.5/src'

gcc -o lua  lua.o liblua.a -lm -Wl,-E -ldl -lreadline -lhistory -lncurses

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o luac.o luac.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o print.o print.c

gcc -o luac  luac.o print.o liblua.a -lm -Wl,-E -ldl -lreadline -lhistory -lncurses

make[2]: Leaving directory `/home/linux/linux_c/lua/lua-5.1.5/src'

make[1]: Leaving directory `/home/linux/linux_c/lua/lua-5.1.5/src'

 

安装

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ sudo make install

cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.1 /usr/local/lib/lua/5.1

cd src && install -p -m 0755 lua luac /usr/local/bin

cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp /usr/local/include

cd src && install -p -m 0644 liblua.a /usr/local/lib

cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ which lua

/usr/local/bin/lua

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ which luac

/usr/local/bin/luac

测试是否安装成功

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ lua

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio

>

linux@ubuntu:~/linux_c/lua/lua-5.1.5$ lua -v

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio

 

 

例子1

#!/usr/bin/lua

--hello world lua program

print ("Hello World!")

 

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ lua test1.lua

Hello World!

 

改进

..lua中字符串的连接符,为了规范,使用的时候前后必须 
有空格,例如:print(10 .. 20) --> 1020 

#!/usr/bin/lua

--hello world lua program

print ("Hello World!")

 

 

str = "Hello World!"

print (str)

 

if str == "Hello World!" then

print "ok"

end

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ lua test1.lua

Hello World!

Hello World!

Ok

 

Lua教程http://tech.it168.com/zt/lua/

 

例子二:

C语言调用LUA脚本

Hello.c

/*

 

**API

**

**            yangj 2011-04-20

**

**

*****************************************************/

 

#include <stdio.h>

 

#include "lua.h"

#include "lauxlib.h"

#include "lualib.h"

 

//#pragma comment(lib, "lualib.lib")

 

int main(void)

{

  lua_State * L = lua_open();         // open lua

  luaL_openlibs(L);

 

  luaL_dofile(L, "./test1.lua");

 

  lua_close(L);

 

  return 0;

}

Test1.lua

#!/usr/bin/lua

--hello world lua program

print ("Hello World!")

 

-- the first program in every language

 

io.write("Hello world, from ",_VERSION,"!\n")

 

str = "Hello World!"

print (str)

 

if str == "Hello World!" then

print "ok"

end

 

print ("This a " .. "string.")

--[[i

/*

 

yunsuani

*/

]]

a={1,2}

b=a

print(a==b, a~=b) -- true, false

a={1,2}

b={1,2}

print(a==b, a~=b) -- false, true

 

function f(x)

 return x*x*x-x-1

end

 

print (f(5))

--[[

t ={

Age = 27

add = function(self, n)

self.Age = self.Age+n

end

}

print(t.Age) -- 27

t.add(t, 10)

print(t.Age) -- 37

]]

 

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ gcc -g hello.c -llua -lm

/usr/local/lib/liblua.a(loadlib.o): In function `ll_loadfunc':

loadlib.c:(.text+0xa17): undefined reference to `dlsym'

loadlib.c:(.text+0xa74): undefined reference to `dlopen'

loadlib.c:(.text+0xa81): undefined reference to `dlerror'

loadlib.c:(.text+0xa99): undefined reference to `dlerror'

/usr/local/lib/liblua.a(loadlib.o): In function `gctm':

loadlib.c:(.text+0xe9c): undefined reference to `dlclose'

collect2: ld returned 1 exit status

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ gcc -g hello.c -llua -lm -ldl

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ ls -l

total 188

-rwxrwxr-x 1 linux linux 180460 Sep 14 18:48 a.out

-rw-rw-r-- 1 linux linux    392 Sep 14 18:47 hello.c

-rwxrwxr-x 1 linux linux    559 Sep 14 16:41 test1.lua

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ ./a.out

Hello World!

Hello world, from Lua 5.1!

Hello World!

ok

This a string.

true false

false          true

119

 

例子三:CPP调用LUA

testcpp.cpp

#include <stdio.h>

#include <iostream>

extern "C"

{

   #include "lua.h"

   #include "lualib.h"

   #include "lauxlib.h"

}//在工具中包含文件的那个~~ 

/* Lua解释器指针 */

lua_State * L;

//#pragma comment(lib,"lua51.lib")//包含库文件~~在工具里包含不进来,上面的包含不进来的处理办法是: 

//把lua51.dll 拷到项目的dubug目录下,把lua51.lib拷到项目目录的项目名的文件夹下 

int main ()

{

 //cout<<"cpp invoke lua example";

 printf("cpp invoke lua example\n");

 /* 初始化Lua */

 L = lua_open();

 /* 载入Lua基本库 */

 luaL_openlibs(L);

 /* 运行脚本 ,注意路径*/

 luaL_dofile(L, "./test1.lua");

 /* 清除Lua */

 lua_close(L);

 //printf( "Press enter to exit…" ); 

 //getchar(); 

 return 0;

}

C++中调用LUA

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ g++ -g testcpp.cpp -llua -lm -ldl

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ ./a.out

cpp invoke lua example

Hello World!

Hello world, from Lua 5.1!

Hello World!

ok

This a string.

true false

false          true

119

 

 

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$ cat /usr/local/include/lua.hpp

// lua.hpp

// Lua header files for C++

// <<extern "C">> not supplied automatically because Lua also compiles as C++

 

extern "C" {

#include "lua.h"

#include "lualib.h"

#include "lauxlib.h"

}

C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:

extern "C"

{

#include "cExample.h"

}

所以上述CPP文件extern "C"

{

   #include "lua.h"

   #include "lualib.h"

   #include "lauxlib.h"

}//在工具中包含文件的那个~~ 

可以替换为

#include "lua.hpp"

 

         Openwrt 之uci 在ubuntu中的测试

UCI是Unified Configuration Interface的缩写,翻译成中文就是统一配置接口,用途就是为OpenWrt提供一个集中控制的接口。OpenWrt实现的这个工具,能够让你的不管是Lua还是PHP程序,或者SHELL程序或C程序,只要执行命令传输参数就能达到修改系统参数的目的.

Uci 在ubuntu下的使用.

 

UCI的配置文件被分割成/etc/config下的多个独立的文件,各个文件按名字含义对应系统的不同的功能配置。你可以通过文本编译器或者uci实用程序去修改这些配置文件,同时uci还提供了C语言/脚本/Lua等语言的应用程序接口,WEB配置页面例如Luci就是利用了uci所提供的API而实现对UCI配置文件的修改的。

不管你是采用文本编辑器还是通过命令行的方式修改了UCI配置文件,相应的服务或应用程序不会自动更新状态,这时你都必须调用一次/etc/init.d (re)start才能使刚刚对UCI配置文件的修改生效。许多兼容UCI的程序采用这样的方法来应用更新:在init.d脚本执行流中去修改自己程序的配置文件。具体说来,init.d脚本先去修改自己程序的原配置文件中的信息(如/etc/samba/smb.conf),之后重启一次应用程序,应用程序就会去读自己的配置文件(刚刚被init.d更新过的)再启动,这样应用程序的状态就更新了。仅仅重启应用程序,而不执行init.d脚本的话,/etc/config下的UCI配置文件是不会应用于应用程序的,新配置也就不生效了。

 

linux@ubuntu:~/linux_c/uci$ ls -l

total 56

drwxr-xr-x 5 linux linux  4096 Jul 21 09:31 uci-2014-04-11.1

-rw-rw-r-- 1 linux linux 50065 Sep 14 19:25 uci-2014-04-11.1.tar.gz

linux@ubuntu:~/linux_c/uci$ cd uci-2014-04-11.1/

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ ls -l

total 196

-rw-r--r-- 1 linux linux  4864 Jul 21 09:31 blob.c

-rw-r--r-- 1 linux linux 14589 Jul 21 09:31 cli.c

-rw-r--r-- 1 linux linux  1013 Jul 21 09:31 CMakeLists.txt

-rw-r--r-- 1 linux linux 10991 Jul 21 09:31 delta.c

-rw-r--r-- 1 linux linux 19524 Jul 21 09:31 file.c

-rw-r--r-- 1 linux linux  5290 Jul 21 09:31 libuci.c

-rw-r--r-- 1 linux linux 16379 Jul 21 09:31 list.c

-rw-r--r-- 1 linux linux 17600 Jul 21 09:31 list.h

drwxr-xr-x 2 linux linux  4096 Jul 21 09:31 lua

-rw-r--r-- 1 linux linux  2587 Jul 21 09:31 parse.c

drwxr-xr-x 2 linux linux  4096 Jul 21 09:31 sh

drwxr-xr-x 6 linux linux  4096 Jul 21 09:31 test

-rw-r--r-- 1 linux linux  1299 Jul 21 09:31 uci_blob.h

-rw-r--r-- 1 linux linux    59 Jul 21 09:31 uci_config.h.in

-rw-r--r-- 1 linux linux 17605 Jul 21 09:31 uci.h

-rw-r--r-- 1 linux linux  7220 Jul 21 09:31 uci_internal.h

-rw-r--r-- 1 linux linux 19146 Jul 21 09:31 ucimap.c

-rw-r--r-- 1 linux linux  9118 Jul 21 09:31 ucimap.h

-rw-r--r-- 1 linux linux  5109 Jul 21 09:31 util.c

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ cmake .

-- The C compiler identification is GNU

-- Check for working C compiler: /usr/bin/gcc

-- Check for working C compiler: /usr/bin/gcc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Configuring done

-- Generating done

-- Build files have been written to: /home/linux/linux_c/uci/uci-2014-04-11.1

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ make

Scanning dependencies of target uci

[ 11%] Building C object CMakeFiles/uci.dir/libuci.c.o

[ 22%] Building C object CMakeFiles/uci.dir/file.c.o

[ 33%] Building C object CMakeFiles/uci.dir/util.c.o

[ 44%] Building C object CMakeFiles/uci.dir/delta.c.o

[ 55%] Building C object CMakeFiles/uci.dir/parse.c.o

[ 66%] Building C object CMakeFiles/uci.dir/blob.c.o

Linking C shared library libuci.so

[ 66%] Built target uci

Scanning dependencies of target cli

[ 77%] Building C object CMakeFiles/cli.dir/cli.c.o

Linking C executable uci

[ 77%] Built target cli

Scanning dependencies of target ucimap

[ 88%] Building C object CMakeFiles/ucimap.dir/ucimap.c.o

Linking C static library libucimap.a

[ 88%] Built target ucimap

Scanning dependencies of target uci_lua

[100%] Building C object lua/CMakeFiles/uci_lua.dir/uci.c.o

Linking C shared module uci.so

[100%] Built target uci_lua

 

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ file uci

uci: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xd271be1dcdf6d41d5e6517da451263c291483673, not stripped

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ sudo make install

[sudo] password for linux:

[ 66%] Built target uci

[ 77%] Built target cli

[ 88%] Built target ucimap

[100%] Built target uci_lua

Install the project...

-- Install configuration: ""

-- Installing: /usr/local/include/uci.h

-- Installing: /usr/local/include/uci_config.h

-- Installing: /usr/local/include/uci_blob.h

-- Installing: /usr/local/include/ucimap.h

-- Installing: /usr/local/lib/libuci.so

-- Installing: /usr/local/bin/uci

-- Removed runtime path from "/usr/local/bin/uci"

-- Installing: /usr/local/lib/lua/5.1/uci.so

-- Removed runtime path from "/usr/local/lib/lua/5.1/uci.so"

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ which uci

/usr/local/bin/uci

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ uci -v

uci: error while loading shared libraries: libuci.so: cannot open shared object file: No such file or directory

 

linux@ubuntu:/usr/local/lib$ ldd /usr/local/bin/uci

         linux-gate.so.1 =>  (0xb779f000)

         libuci.so => not found

         libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e7000)

         /lib/ld-linux.so.2 (0xb77a0000)

linux@ubuntu:/usr/local/lib$ LD_DEBUG=libs uci -v

      5877:   find library=libuci.so [0]; searching

      5877:   search cache=/etc/ld.so.cache

      5877:   search path=/lib/i386-linux-gnu/tls/i686/sse2/cmov:/lib/i386-linux-gnu/tls/i686/sse2:/lib/i386-linux-gnu/tls/i686/cmov:/lib/i386-linux-gnu/tls/i686:/lib/i386-linux-gnu/tls/sse2/cmov:/lib/i386-linux-gnu/tls/sse2:/lib/i386-linux-gnu/tls/cmov:/lib/i386-linux-gnu/tls:/lib/i386-linux-gnu/i686/sse2/cmov:/lib/i386-linux-gnu/i686/sse2:/lib/i386-linux-gnu/i686/cmov:/lib/i386-linux-gnu/i686:/lib/i386-linux-gnu/sse2/cmov:/lib/i386-linux-gnu/sse2:/lib/i386-linux-gnu/cmov:/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu/tls/i686/sse2/cmov:/usr/lib/i386-linux-gnu/tls/i686/sse2:/usr/lib/i386-linux-gnu/tls/i686/cmov:/usr/lib/i386-linux-gnu/tls/i686:/usr/lib/i386-linux-gnu/tls/sse2/cmov:/usr/lib/i386-linux-gnu/tls/sse2:/usr/lib/i386-linux-gnu/tls/cmov:/usr/lib/i386-linux-gnu/tls:/usr/lib/i386-linux-gnu/i686/sse2/cmov:/usr/lib/i386-linux-gnu/i686/sse2:/usr/lib/i386-linux-gnu/i686/cmov:/usr/lib/i386-linux-gnu/i686:/usr/lib/i386-linux-gnu/sse2/cmov:/usr/lib/i386-linux-gnu/sse2:/usr/lib/i386-linux-gnu/cmov:/usr/lib/i386-linux-gnu:/lib/tls/i686/sse2/cmov:/lib/tls/i686/sse2:/lib/tls/i686/cmov:/lib/tls/i686:/lib/tls/sse2/cmov:/lib/tls/sse2:/lib/tls/cmov:/lib/tls:/lib/i686/sse2/cmov:/lib/i686/sse2:/lib/i686/cmov:/lib/i686:/lib/sse2/cmov:/lib/sse2:/lib/cmov:/lib:/usr/lib/tls/i686/sse2/cmov:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686/cmov:/usr/lib/tls/i686:/usr/lib/tls/sse2/cmov:/usr/lib/tls/sse2:/usr/lib/tls/cmov:/usr/lib/tls:/usr/lib/i686/sse2/cmov:/usr/lib/i686/sse2:/usr/lib/i686/cmov:/usr/lib/i686:/usr/lib/sse2/cmov:/usr/lib/sse2:/usr/lib/cmov:/usr/lib           (system search path)

      5877:     trying file=/lib/i386-linux-gnu/tls/i686/sse2/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/i686/sse2/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/i686/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/i686/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/sse2/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/sse2/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/i686/sse2/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/i686/sse2/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/i686/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/i686/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/sse2/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/sse2/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/i686/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/i686/sse2/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/i686/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/i686/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/sse2/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/i686/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/i686/sse2/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/i686/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/i686/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/sse2/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/libuci.so

      5877:     trying file=/lib/tls/i686/sse2/cmov/libuci.so

      5877:     trying file=/lib/tls/i686/sse2/libuci.so

      5877:     trying file=/lib/tls/i686/cmov/libuci.so

      5877:     trying file=/lib/tls/i686/libuci.so

      5877:     trying file=/lib/tls/sse2/cmov/libuci.so

      5877:     trying file=/lib/tls/sse2/libuci.so

      5877:     trying file=/lib/tls/cmov/libuci.so

      5877:     trying file=/lib/tls/libuci.so

      5877:     trying file=/lib/i686/sse2/cmov/libuci.so

      5877:     trying file=/lib/i686/sse2/libuci.so

      5877:     trying file=/lib/i686/cmov/libuci.so

      5877:     trying file=/lib/i686/libuci.so

      5877:     trying file=/lib/sse2/cmov/libuci.so

      5877:     trying file=/lib/sse2/libuci.so

      5877:     trying file=/lib/cmov/libuci.so

      5877:     trying file=/lib/libuci.so

      5877:     trying file=/usr/lib/tls/i686/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/tls/i686/sse2/libuci.so

      5877:     trying file=/usr/lib/tls/i686/cmov/libuci.so

      5877:     trying file=/usr/lib/tls/i686/libuci.so

      5877:     trying file=/usr/lib/tls/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/tls/sse2/libuci.so

      5877:     trying file=/usr/lib/tls/cmov/libuci.so

      5877:     trying file=/usr/lib/tls/libuci.so

      5877:     trying file=/usr/lib/i686/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i686/sse2/libuci.so

      5877:     trying file=/usr/lib/i686/cmov/libuci.so

      5877:     trying file=/usr/lib/i686/libuci.so

      5877:     trying file=/usr/lib/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/sse2/libuci.so

      5877:     trying file=/usr/lib/cmov/libuci.so

      5877:     trying file=/usr/lib/libuci.so

      5877:  

uci: error while loading shared libraries: libuci.so: cannot open shared object file: No such file or directory

 

 

linux@ubuntu:/usr/local/lib$ ln -s /usr/local/lib/libuci.so /usr/lib/libuci.so

ln: failed to create symbolic link `/usr/lib/libuci.so': Permission denied

linux@ubuntu:/usr/local/lib$ sudo ln -s /usr/local/lib/libuci.so /usr/lib/libuci.so

linux@ubuntu:/usr/local/lib$ ldd /usr/local/bin/uci

         linux-gate.so.1 =>  (0xb7776000)

         libuci.so => /usr/lib/libuci.so (0xb7757000)

         libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b2000)

         libubox.so => /usr/lib/libubox.so (0xb75a7000)

         /lib/ld-linux.so.2 (0xb7777000)

         librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb759e000)

         libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7583000)

 

OK ,test下

linux@ubuntu:/usr/local/lib$ uci --version

uci: invalid option -- '-'

Usage: uci [<options>] <command> [<arguments>]

 

Commands:

         batch

         export     [<config>]

         import     [<config>]

         changes    [<config>]

         commit     [<config>]

         add        <config> <section-type>

         add_list   <config>.<section>.<option>=<string>

         del_list   <config>.<section>.<option>=<string>

         show       [<config>[.<section>[.<option>]]]

         get        <config>.<section>[.<option>]

         set        <config>.<section>[.<option>]=<value>

         delete     <config>[.<section>[[.<option>][=<id>]]]

         rename     <config>.<section>[.<option>]=<name>

         revert     <config>[.<section>[.<option>]]

         reorder    <config>.<section>=<position>

 

Options:

         -c <path>  set the search path for config files (default: /etc/config)

         -d <str>   set the delimiter for list values in uci show

         -f <file>  use <file> as input instead of stdin

         -m         when importing, merge data into an existing package

         -n         name unnamed sections on export (default)

         -N         don't name unnamed sections

         -p <path>  add a search path for config change files

         -P <path>  add a search path for config change files and use as default

         -q         quiet mode (don't print error messages)

         -s         force strict mode (stop on parser errors, default)

         -S         disable strict mode

         -X         do not use extended syntax on 'show'

 

Uci使用

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ pwd

/home/linux/linux_c/uci/uci-2014-04-11.1/test/config

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ ls -l

total 4

-rw-r--r-- 1 linux linux 452 Jul 21 09:31 network

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ cat network

config 'alias' 'a'

         option 'interface' 'lan'

 

config 'alias' 'b'

         option 'interface' 'lan'

 

config 'interface' 'lan'

         option 'proto' 'static'

         option 'ifname' 'eth0'

         option 'test' '123'

         option 'enabled' 'off'

         option 'ipaddr' '2.3.4.5'

 

config 'interface' 'wan'

         option 'proto'   'dhcp'

         option 'ifname' 'eth1'

         option 'enabled' 'on'

         option 'aliases' 'c d'

        

config 'alias' 'c'

         option 'interface' 'wan'

 

config 'alias' 'd'

         option 'interface' 'wan'

 

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

network.a=alias

network.a.interface=lan

network.b=alias

network.b.interface=lan

network.lan=interface

network.lan.proto=static

network.lan.ifname=eth0

network.lan.test=123

network.lan.enabled=off

network.lan.ipaddr=2.3.4.5

network.wan=interface

network.wan.proto=dhcp

network.wan.ifname=eth1

network.wan.enabled=on

network.wan.aliases=c d

network.c=alias

network.c.interface=wan

network.d=alias

network.d.interface=wan

 

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show  network.b -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

network.b=alias

network.b.interface=lan

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show  network.lan -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

network.lan=interface

network.lan.proto=static

network.lan.ifname=eth0

network.lan.test=123

network.lan.enabled=off

network.lan.ipaddr=2.3.4.5

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show  network.lan.test -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

network.lan.test=123

 

 

uci add操作

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci add  network test  -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

cfg0a6865

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci commit

uci: Entry not found

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci commit -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ cat network

 

config alias 'a'

         option interface 'lan'

 

config alias 'b'

         option interface 'lan'

 

config interface 'lan'

         option proto 'static'

         option ifname 'eth0'

         option test '123'

         option enabled 'off'

         option ipaddr '2.3.4.5'

 

config interface 'wan'

         option proto 'dhcp'

         option ifname 'eth1'

         option enabled 'on'

         option aliases 'c d'

 

config alias 'c'

         option interface 'wan'

 

config alias 'd'

         option interface 'wan'

 

config wire 'test'

 

config test

 

config test

生效修改(任何写入类的语法,最终都要执行生效修改,否则所做修改只在缓存中,切记!)

 

 

创建UCI文件并测试

默认uci搜索目录是/etc/config

linux@ubuntu:/etc/config$ sudo mkdir -p /etc/config

linux@ubuntu:/etc/config$ sudo touch test

linux@ubuntu:/etc/config$ ls -l

total 0

-rw-r--r-- 1 root root 0 Sep 15 09:51 test

linux@ubuntu:/etc/config$ sudo chown linux:linux  test

linux@ubuntu:/etc/config$ ls -l

total 0

-rw-r--r-- 1 linux linux 0 Sep 15 09:51 test

linux@ubuntu:/etc/config$ chmod 777 test

linux@ubuntu:/etc/config$ vi test

linux@ubuntu:/etc/config$ uci show

test.abc=test

test.abc.test_var=value

test.abc.test_var2=value22

linux@ubuntu:/etc/config$ cat test

config 'test' 'abc'

        option 'test_var' 'value'

        option 'test_var2' 'value22'

参考

总结:

1. 和共享库相关的一些错误如何处理:

1> LD_DEBUG命令:

LD_DEBUG glibc中的 loader 为了方便自身调试而设置的一个环境变量。通过设置这个环境变量,可以方便的看到 loader 的加载过程。

 

UCI API的使用

C中调用UCI API

http://blog.chinaunix.net/uid-26675482-id-4633889.html

 

 

 

好了 ,lua 学习 , uci也学习了,接下来就是luci

 

Lua中使用UCI 例子:

Luci文件源代码:

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$cat test1.luci

#!/usr/bin/lua

--helloworld lua program

print("Hello World!")

 

 

require("uci")

 

-- Get asection type or an option

x =uci.cursor()

a =x:get("test", "abc", "test_var")

print(a)

-- Getthe configuration directory

b =x:get_confdir()

print(b)

 

-- Getall sections of a config or all values of a section

d =x:get_all("test", "abc")

print(d)

print(d["test_var"])

print(d["test_var2"])

 

uci 文件具体内容

linux@ubuntu:/etc/config$pwd

/etc/config

linux@ubuntu:/etc/config$cat test

config'test' 'abc'

        option 'test_var' 'value'

        option 'test_var2' 'value22'

 

 

执行测试输出结果:

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$lua test1.luci

HelloWorld!

value

/etc/config

table:0x9190018

value

value22

 

 

Luci api

http://luci.subsignal.org/api/luci/

http://wiki.openwrt.org/doc/techref/uci#api

0 0