编译mysql记录

/home/mysql_5.5.32/mysql-5.5.32-arm/mysql-5.5.32/include/my_global.h  974 行因为 ulong没有定义被我注释掉,因为考虑后面没有使用这个变量的。具体为/ *typedef ulong nesting_map; */ /* Used for flags of nesting constructs */


/home/mysql_5.5.32/mysql-5.5.32-arm/mysql-5.5.32/sql/gen_lex_hash.cc:334: undefined reference to `stderr'


修改方法:Turns out I was chasing the wrong thing. The ASI SDK was statically compiled against the glibc which contains stderras globally available symbols, whereas bionic (the Android libc) doesn't contain them.


All I had to do was to undefine stderrand created it myself as a linker symbol, so the linker can find it:


#include <jni.h> #include <stdio.h> #include <ASICamera2.h> #undef stderr FILE *stderr = &__sF[2]; 

 nm /usr/ndk/android-ndk-r14b/platforms/android-21/arch-arm64/usr/lib/libc.a|grep __sF

包含 stdio。h即可有相应的定义。

但是链接的时候只有23和24的平台有相应的符号链接,不知道啥原因,那么暂时只能对应23和24的链接了。

81%报错

libsql.a(mysqld.cc.o): In function `init_error_log_mutex()':
mysqld.cc:(.text+0x1e9f): undefined reference to `my_fast_mutexattr'
libsql.a(mysqld.cc.o): In function `init_thread_environment()':
mysqld.cc:(.text+0x49cc): undefined reference to `my_fast_mutexattr'
mysqld.cc:(.text+0x49e3): undefined reference to `my_fast_mutexattr'
mysqld.cc:(.text+0x49fa): undefined reference to `my_fast_mutexattr'
mysqld.cc:(.text+0x4a11): undefined reference to `my_fast_mutexattr'
libsql.a(mysqld.cc.o):mysqld.cc:(.text+0x4a28): more undefined references to `my_fast_mutexattr' follow
collect2: ld returned 1 exit status
make[2]: *** [sql/mysqld] Error 1
make[1]: *** [sql/CMakeFiles/mysqld.dir/all] Error 2
make: *** [all] Error 2



197

#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
#endif



 error: ‘RTLD_DEFAULT’ undeclared 

/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/plugin/auth/dialog.c: In function ‘init_dialog’:
/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/plugin/auth/dialog.c:318:3: warning: implicit declaration of function ‘GetModuleHandle’ [-Wimplicit-function-declaration]
   void *sym= dlsym(RTLD_DEFAULT, "mysql_authentication_dialog_ask");
   ^
/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/plugin/auth/dialog.c:41:24: warning: passing argument 1 of ‘dlsym’ makes pointer from integer without a cast
  # define RTLD_DEFAULT GetModuleHandle(NULL)


我自己直接定义了,因为这个变宏定义的话需要的是win32或者没有这个支持的。既然需要我就直接定义了。后续有问题再回头看。


报错

In file included from /home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/el.h:50:0,
                 from /home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/chared.c:47:
/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/chartype.h:57:3: error: #error wchar_t must store ISO 10646 characters
  #error wchar_t must store ISO 10646 characters

貌似是需要c++ 支持c++11 但是好像还是解决不了。



报错

/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/el.c:53:22: fatal error: langinfo.h: No such file or directory
 #include <langinfo.h>

被我直接写绝对路径。





报错

/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/include/my_dir.h:38:20: error: 'S_IREAD' undeclared (first use in this function)
 #define MY_S_IREAD S_IREAD /* read permission, owner */

这个是缺乏系统的stat文件导致需要包含。但是我包含ndk的过程中发现了有几个头文件自己包含自己,并且只有一句话,所以我给注销了。

写成绝对路径不是个好方法,但是相对路径又不起作用,暂时写绝对路径吧。

报错


/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/zlib/gzio.c:1006:48: error: 'errno' undeclared (first use in this function)
     m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);

应该是缺乏头文件报错

后来加上stl的头文件一样爆粗,我根据文件中errno的判定,知道是个整数,所以直接在前面int errno; 以后有错误再改正,编译的继续下去。

后来发现其实有定义的。/usr/ndk/android-ndk-r14b/platforms/android-21/arch-arm/usr/include/

报错

/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/sig.h:62:19: error: array type has incomplete element type
  struct sigaction sig_action[ALLSIGSNO];
                   
/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/sig.h:63:2: error: unknown type name 'sigset_t'
  sigset_t sig_set;
  ^
/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/sig.h:64:11: error: unknown type name 'sig_atomic_t'
  volatile sig_atomic_t sig_no;

这里面有个问题那就是  sigset_t  sig_atomic_t 同样都定义与signal。文件中,我不能同时包含,那么我查看了sig_atomic_t的定义,就直接typedef int 了,有问题再改成,ndk做的也太复杂了。


继续报错

/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/readline.c:1358:10: error: 'errno'ndeclared (first use in this function)
   return errno;

同样方法解决。

报错

INT_MAX没有找到 

发现是引用的limit路径不对,写成 /usr/ndk/android-ndk-r14b/sysroot/usr/include/limits。h即可。

报错

/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/vi.c:1024:33: error: 'MB_LEN_MAX' undeclared (first use in this function)
 #define TMP_BUFSIZ (EL_BUFSIZ * MB_LEN_MAX)

我估计还是引用文件路径不正确引起的,很奇怪对libedit和libreadline编译的时候找不准确。

ndk编译有个核心问题,那就是依赖文件的选择,比如

/usr/ndk/android-ndk-r14b/platforms/android-21/arch-arm64/usr/include/errno.h

/usr/ndk/android-ndk-r14b/sysroot/usr/include/asm-generic/errno.h
/usr/ndk/android-ndk-r14b/sysroot/usr/include/linux/errno.h
/usr/ndk/android-ndk-r14b/sysroot/usr/include/sys/errno.h
/usr/ndk/android-ndk-r14b/sources/android/support/include/errno.h
/usr/ndk/android-ndk-r14b/sources/cxx-stl/stlport/stlport/errno.h
/usr/ndk/android-ndk-r14b/sources/cxx-stl/llvm-libc++/include/errno.h

同样的文件有那么多一样的,如何去选择就是比较关键了。

解决思路,这个里面确实有顺序之分,首先应该匹配的应该在flags最前面。只能是这个规则了。目前测试时有效的。事实证明我之前做的之前定义 int errno是错的。重新编译又得重新更改了。

另外当有多个可搜索目录的时候,<sys/stat.h>这种如何选择?


/usr/ndk/android-ndk-r14b/sysroot/usr/include/sys/wait.h:66:37: error: unknown type name 'siginfo_t'
 int waitid(idtype_t which, id_t id, siginfo_t* info, int options);


果然又缺文件,自己组织编译选项实在是痛苦的事。

/usr/ndk/android-ndk-r14b/platforms/android-21/arch-arm64/usr/include/asm-generic/siginfo.h:




/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/cmd-line-utils/libedit/tty.c:483:59: error: 'errno' undeclared (first use in this function)



报错

/home/mysql_5.5.32/mysql-5.5.32_arm/mysql-5.5.32/include/my_dir.h:38:20: note: each undeclared identifier is reported only once for each function it appears in
 #define MY_S_IREAD S_IREAD /* read permission, owner */

前面已经有记载,包含stat。h头文件任然报错,原来这个定义需要在#if defined(__USE_BSD) || defined(__USE_GNU)  才满足。
考虑到bsd与gnu不定义,我强制给这个变量给定义了,位于sys中stat。h文件中。




报错

../mysys/libmysys.a(default.c.o): In function `my_print_default_files':
default.c:(.text.my_print_default_files+0xac): undefined reference to `stdout'
default.c:(.text.my_print_default_files+0xb0): undefined reference to `stdout'
default.c:(.text.my_print_default_files+0xf8): undefined reference to `stdout'
default.c:(.text.my_print_default_files+0xfc): undefined reference to `stdout'
default.c:(.text.my_print_default_files+0x20c): undefined reference to `stdout'

注意这个是没有链接相应的库造成的。


Linux的现有应用程序或库需要移植到Android上,一般来说都要修改源码使其适合Android自己重新实现的C库Bionic。Bionic相对于Glib更简略,更高效,但是有些Glibc中有的库函数或者包装的syscall在bionic中没有实现,如果Linux原来的应用程序或者库使用到了这些bionic没有实现函数,那就要做相应修改才能让程序编译运

此符号正是glibc提供的



报错

../mysys/libmysys.a(mf_pack.c.o): In function `expand_tilde':
mf_pack.c:(.text.expand_tilde+0x90): undefined reference to `endpwent'
collect2: error: ld returned 1 exit status
make[2]: *** [extra/comp_err] Error 1
make[1]: *** [extra/CMakeFiles/comp_err.dir/all] Error 2
make: *** [all] Error 2

由于这个符号android ndk不支持需要在glibc里面,所以强行给予注销。 文件的390行。


直接写绝对路径。

I/usr/ndk/android-ndk-r14b/platforms/android-23/arch-arm64/usr/include/


报错,提示不能执行可执行文件,这个是由于cmake 没有配置-DCMAKE_SYSROOT的原因。

报错

../mysys/libmysys.a(my_fopen.c.o): In function `my_fopen':
my_fopen.c:(.text.my_fopen+0x1a0): undefined reference to `__errno_location'



这个还是由于上述原因,因为这个引用是glibc的,android 的libc却没有保护。因为errno的时候引入了一个变量。这个不好解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值