windows 中ssh无法和虚拟机中的linux通信 sqlite 交叉编译

今天突然发现ssh无法和虚拟机中的连接,总是报server端ssh关闭,那就重启linux上的ssh吧,我用命令“ sudo   /etc/init.d/ssh  start "后,却说不要通过调用 这个脚本启动程序,要用服务工具,好,就改为” sudo  service ssh start ", 然后再次连接,ok。

只写个ssh连接不上好像太少了,再加点吧


下载sqlite版本3.7.9 http://www.sqlite.org/download.html

源码包:sqlite-autoconf-3070900.tar.gz

解压源码包到/opt目录下:

# tar xvzf sqlite-autoconf-3070900.tar.gz C /opt/

建立make install目录

# mkdir /opt/build

   进入解压出得文件夹中:

# cd /opt/sqlite-autoconf-3070900

   执行configure命令,生成Makefile文件:

# ./configure  CC=/home/wangwei/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi-gcc  --disable-tcl --host=arm-linux –prefix=/opt/build

   生成Makefile文件后,执行make命令,进行交叉编译,再执行make install 命令进行安装,就可以在指定的目录的lib下找到编译好的库。


补充说明,我看网上很多说交叉编译的,他们有一些都没有说要指定CC变量,仅仅指定了--host,这样好像不行,在进行configure时会有警告。

我进行的编译很顺利,没有什么错误。下边是一些从网站上找到的关于出错时该怎么修改:

使用arm-linux-gcc 4.3.2版本执行make后会有错误提示,终止编译,命令行打印信息如下(后来使用arm-linux-gcc 4.4.3版本无错误提示,可以直接完成编译):

/bin/sh ./libtool --tag=CC   --mode=compile arm-linux-gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.7.9\" -DPACKAGE_STRING=\"sqlite\ 3.7.9\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.7.9\" -D_FILE_OFFSET_BITS=64 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -I.@am__isrc@    -D_REENTRANT=1 -DSQLITE_THREADSAFE=1  -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE -g -O2 -MT sqlite3.lo -MD -MP -MF .deps/sqlite3.Tpo -c -o sqlite3.lo sqlite3.c

mkdir .libs

 arm-linux-gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.7.9\" "-DPACKAGE_STRING=\"sqlite 3.7.9\"" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.7.9\" -D_FILE_OFFSET_BITS=64 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -I.@am__isrc@ -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE -g -O2 -MT sqlite3.lo -MD -MP -MF .deps/sqlite3.Tpo -c sqlite3.c  -fPIC -DPIC -o .libs/sqlite3.o

arm-none-linux-gnueabi-gcc: 3.7.9": No such file or directory

<command-line>: warning: missing terminating " character

查找原因,与前文的make信息-DPACKAGE_STRING=\"sqlite\ 3.7.9\"相比较,发现是因为"-DPACKAGE_STRING=\"sqlite 3.7.9\""字符之间空格没有转义字符\(之后发现是使用交叉编译器arm-linux-gcc4.3.2会出现这个错误)。

修改Makefile文件:

# vim Makefile

136行找到-DPACKAGE_STRING=\"sqlite\ 3.7.9\"改为-DPACKAGE_STRING=\"sqlite_3.7.9\",保存退出。

重新执行make指令,建议在make之前先make clean

等一段时间后,make成功。

#make install

完成之后可以发现,之前所建目录/opt/build下生成bin  include  lib  share四个目录。主要用到的文件有./bin/sqlite3,./include/sqlite3.h以及./lib/下的库文件。

bin文件夹下的sqlite3,是sqlite可执行应用程序,下载到板子Linux系统下的/bin目录或者/usr/bin目录下,并添加文件可执行权限。在板子Linux系统命令行下执行:

[root@windaka bin]# chmod +x sqlite3

进入sqlite命令行,可以实现对数据库的管理。

[root@windaka usr]# sqlite3

SQLite version 3.7.9 2011-11-01 00:52:41

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite>

   提示:要成功在arm开发板运行sqlite3,需要把./lib下的动态链接库下载到板子上。否则会有无法找到动态链接库libsqlite3.so.0的错误提示。

    ./include/sqlite3.h定义了sqliteAPI接口,会在有关sqlitec文件交叉编译时用到。

    ./lib/文件夹下是有关sqlite的静态链接库和动态链接库

# ls lib/

libsqlite3.a  libsqlite3.la  libsqlite3.so  libsqlite3.so.0  libsqlite3.so.0.8.6  pkgconfig

    libsqlite3.so和libsqlite3.so.0都是libsqlite3.so.0.8.6的软链接文件。真正需要下载到板子目录/lib下的动态库是libsqlite3.so.0.8.6。下载到板子后,还需对它建立软链接文件,因为可执行程序寻找的动态链接库的名字为libsqlite3.so.0。(或者直接把libsqlite3.so、libsqlite3.so.0、 libsqlite3.so.0.8.6  下载到开发板的 lib目录下)

[root@windaka plg]# ln -s /lib/libsqlite3.so.0.8.6  /lib/libsqlite3.so.0

    

测试数据库:

  1. a、新建数据库
  2. [rootL-ant]# sqlite3 test.db
  3. SQLite version 3.6.18
  4. Enter ".help" for instructions
  5. Enter SQL statements terminated with a ";"
  6. sqlite> create table film (number,name);
  7. sqlite> insert into film values (1,'aaa');
  8. sqlite> insert into film values (2,'bbb');
  9. sqlite> select * from film;
  10. 1|aaa
  11. 2|bbb
  12. sqlite>.quit
  13. [rootL-ant]#
b、测试程序

  1. //test_sqlite.c
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <sqlite3.h>
  5. static int callback(void *NotUsed, int argc, char **argv, char **azColName)
  6. {
  7.         int i;
  8.         for(i=0; i<argc;i++)
  9.         {
  10.                 printf("%s = %s\n", azColName[i], argv [i]);
  11.         }
  12.         printf("\n");
  13.      return 0;
  14. }
  15. int main(int argc, char **argv)
  16. {
  17.         sqlite3 *db;
  18.         char *zErrMsg = 0;
  19.         int rc;
  20.         if( argc!=3 )
  21.         {
  22.                 fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
  23.         }
  24.         rc = sqlite3_open(argv[1], &db);
  25.         if( rc )
  26.         {
  27.                 fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  28.                 sqlite3_close(db);
  29.         }
  30.         rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  31.         if( rc!=SQLITE_OK )
  32.         {
  33.                 fprintf(stderr, "SQL error: %s\n", zErrMsg);
  34.         }
  35.         sqlite3_close(db);
  36.         return 0;
  37. }
        

 动态编译:

#arm-none-linux-gnueabi-gcc -o test test_sqlite.c -I /opt/build/include/ -L /opt/build/lib/ -lsqlite3

    注:-I制定优先搜索头文件路径,-L制定编译的时候,优先搜索库的路径。

    下载到板子上执行:

  1. [root@windaka]#./test xyz.db "create table tbl0(name varchar(10), number smallint);"
  2. [root@windaka]#./test xyz.db "insert into tbl0 values('cyc', 1);"
  3. [root@windaka]#./test xyz.db "insert into tbl0 values('dzy', 2);"
  4. [root@windaka]#./test xyz.db "select * from tbl0;"
  5. name = cyc
  6. number = 1
  7. name = dzy
  8. number = 2

    测试成功!

    静态编译:

#arm-none-linux-gnueabi-gcc -o test test_sqlite.c -I /opt/build/include/ -L  /opt/build/lib/ -static -lsqlite3


  1. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `unixDlSym':
  2. /opt/sqlite-autoconf-3070900/sqlite3.c:29926: undefined reference to `dlsym'
  3. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexLeave':
  4. /opt/sqlite-autoconf-3070900/sqlite3.c:17807: undefined reference to `pthread_mutex_unlock'
  5. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexTry':
  6. /opt/sqlite-autoconf-3070900/sqlite3.c:17769: undefined reference to `pthread_mutex_trylock'
  7. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexEnter':
  8. /opt/sqlite-autoconf-3070900/sqlite3.c:17723: undefined reference to `pthread_mutex_lock'
  9. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexFree':
  10. /opt/sqlite-autoconf-3070900/sqlite3.c:17680: undefined reference to `pthread_mutex_destroy'
  11. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexAlloc':
  12. /opt/sqlite-autoconf-3070900/sqlite3.c:17654: undefined reference to `pthread_mutex_init'
  13. /opt/sqlite-autoconf-3070900/sqlite3.c:17637: undefined reference to `pthread_mutexattr_init'
  14. /opt/sqlite-autoconf-3070900/sqlite3.c:17638: undefined reference to `pthread_mutexattr_settype'
  15. /opt/sqlite-autoconf-3070900/sqlite3.c:17639: undefined reference to `pthread_mutex_init'
  16. /opt/sqlite-autoconf-3070900/sqlite3.c:17640: undefined reference to `pthread_mutexattr_destroy'
  17. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `unixDlClose':
  18. /opt/sqlite-autoconf-3070900/sqlite3.c:29930: undefined reference to `dlclose'
  19. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `unixDlError':
  20. /opt/sqlite-autoconf-3070900/sqlite3.c:29899: undefined reference to `dlerror'
  21. /opt/build/lib//libsqlite3.a(sqlite3.o): In function `unixDlOpen':
  22. /opt/sqlite-autoconf-3070900/sqlite3.c:29885: undefined reference to `dlopen'
  23. collect2: ld returned 1 exit status

 错误信息中提示有线程接口函数,需要线程的动态链接库,要加入-lpthread选项。在网上查找,按照网友提供的资料dlopen(),dlclose(),dlerror(),dlsym()函数在头文件#include <dlfcn.h>中,同样需要添加编译选项-ldl。

# arm-linux-gcc -o test test.c -I /opt/build/include/ -L /opt/build/lib  -static -lsqlite3 -lpthread ldl

 编译成功,但有一个warning,没有解决,暂时没有发现这个警告对程序影响。

/opt/build/lib/libsqlite3.a(sqlite3.o): In function `unixDlOpen':

/opt/sqlite-autoconf-3070900/sqlite3.c:29885: warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

 静态编译与动态编译的差别在于,可执行文件较大,即使板子上没有移植动态链接库libsqlite3.so.0,程序也同样可以执行。



你可能感兴趣的:(sqlite,ssh,交叉编译)