zlog交叉编译的问题

yfn020 发布于 2012/06/25 09:32
阅读 1K+
收藏 1

@难易 你好,想跟你请教个问题:

我想在arm上使用zlog系统,编译的步骤如下:

1、./configure --enable-test --host=arm-linux

2、make

但是出现如下错误:

省略前面能编译过的部分

......

/bin/sh ../libtool --tag=CC   --mode=compile arm-linux-gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -D_GNU_SOURCE -pthread -MT category_table.lo -MD -MP -MF .deps/category_table.Tpo -c -o category_table.lo category_table.c

libtool: compile:  arm-linux-gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -D_GNU_SOURCE -pthread -MT category_table.lo -MD -MP -MF .deps/category_table.Tpo -c category_table.c  -fPIC -DPIC -o .libs/category_table.o

libtool: compile:  arm-linux-gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -D_GNU_SOURCE -pthread -MT category_table.lo -MD -MP -MF .deps/category_table.Tpo -c category_table.c -o category_table.o >/dev/null 2>&1

mv -f .deps/category_table.Tpo .deps/category_table.Plo

/bin/sh ../libtool --tag=CC   --mode=compile arm-linux-gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -D_GNU_SOURCE -pthread -MT zlog.lo -MD -MP -MF .deps/zlog.Tpo -c -o zlog.lo zlog.c

libtool: compile:  arm-linux-gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -D_GNU_SOURCE -pthread -MT zlog.lo -MD -MP -MF .deps/zlog.Tpo -c zlog.c  -fPIC -DPIC -o .libs/zlog.o

zlog.c: In function 'hzlog':

zlog.c:761: error: incompatible type for argument 11 of 'zlog_output'

zlog.c: In function 'hdzlog':

zlog.c:783: error: incompatible type for argument 10 of 'dzlog_output'

make[2]: *** [zlog.lo] 错误 1

make[2]: Leaving directory `/home/work/yaof/workspace/zlog-1.0.7/libzlog'

make[1]: *** [all-recursive] 错误 1

make[1]: Leaving directory `/home/work/yaof/workspace/zlog-1.0.7'

make: *** [all] 错误 2

以下是问题补充:

@yfn020:我的gcc版本: [root@jzq zlog-1.0.7]# arm-linux-gcc -v Using built-in specs. Target: arm-none-linux-gnueabi Configured with: /scratch/julian/lite-respin/linux/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2008q3-72' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin Thread model: posix gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) (2012/06/25 09:59)
加载中
0
难易
难易

 看了一下,是va_list这个参数的问题,在hzlog和hdzlog里面,这个参数是不用的,所以我传值为0,不过看来这在arm上不行。

zlog_output(category, file, filelen, func, funclen, line, level, buf, buf_len, NULL, 0, ZLOG_HEX);

static int zlog_output(zlog_category_t * a_category,

                const char *file, size_t file_len, const char *func, size_t func_len, long line, int level,

                const void *hex_buf, size_t hex_buf_len, const char *str_format, va_list str_args,

                int generate_cmd)

 

我查了一些资料,包括这些

https://bugzilla.redhat.com/show_bug.cgi?id=744707

https://bugs.launchpad.net/maria/+bug/700982

不过里面都没有提具体的解决方法,这里倒是有一个:

http://bugs.mysql.com/bug.php?id=62769&files=1

diff -Naur mysql-4.5.16.orig/sql-common/client_plugin.c mysql-5.5.16/sql-common/client_plugin.c
--- mysql-5.5.16.orig/sql-common/client_plugin.c	2011-09-09 11:56:39.000000000 -0400
+++ mysql-5.5.16/sql-common/client_plugin.c	2011-10-16 23:00:00.708799138 -0400
@@ -228,11 +228,13 @@
 {
   MYSQL mysql;
   struct st_mysql_client_plugin **builtin;
+  va_list unused;
 
   if (initialized)
     return 0;
 
   bzero(&mysql, sizeof(mysql)); /* dummy mysql for set_mysql_extended_error */
+  bzero(&unused, sizeof(unused)); /* suppress uninitialized-value warnings */
 
   pthread_mutex_init(&LOCK_load_client_plugin, MY_MUTEX_INIT_SLOW);
   init_alloc_root(&mem_root, 128, 128);
@@ -244,7 +246,7 @@
   pthread_mutex_lock(&LOCK_load_client_plugin);
 
   for (builtin= mysql_client_builtins; *builtin; builtin++)
-    add_plugin(&mysql, *builtin, 0, 0, 0);
+    add_plugin(&mysql, *builtin, 0, 0, unused);
 
   pthread_mutex_unlock(&LOCK_load_client_plugin);
 
@@ -288,9 +290,13 @@
 mysql_client_register_plugin(MYSQL *mysql,
                              struct st_mysql_client_plugin *plugin)
 {
+  va_list unused;
+
   if (is_not_initialized(mysql, plugin->name))
     return NULL;
 
+  bzero(&unused, sizeof(unused)); /* suppress uninitialized-value warnings */
+
   pthread_mutex_lock(&LOCK_load_client_plugin);
 
   /* make sure the plugin wasn't loaded meanwhile */
@@ -302,7 +308,7 @@
     plugin= NULL;
   }
   else
-    plugin= add_plugin(mysql, plugin, 0, 0, 0);
+    plugin= add_plugin(mysql, plugin, 0, 0, unused);
 
   pthread_mutex_unlock(&LOCK_load_client_plugin);
   return plugin;

我建议你可以试试这么改

/* 761 行附近 */

void hzlog(zlog_category_t * category,
        const char *file, size_t filelen, const char *func, size_t funclen, long line, int level,
        const void *buf, size_t buf_len)
{
        va_list unused;
        zlog_output(category, file, filelen, 
        func, funclen, line, level, buf, buf_len, 
        NULL, unused, ZLOG_HEX);
}

/* 783行附近 */
void hdzlog(const char *file, size_t filelen, const char *func, size_t funclen, long line, int level,
        const void *buf, size_t buf_len)
{
        va_list unused;
        dzlog_output(file, filelen, 
        func, funclen, line, level, buf, buf_len, 
        NULL, unused, ZLOG_HEX);
}

鱼木
为什么我找不到./configure,怎么进行交叉编译
0
y
yfn020

恩,更改后没有报错了。

0
难易
难易

这么改在我的环境下能通过编译,看看你的情况如何?

不过我觉得不够漂亮,而且传不需要的参数会降低性能。

只是我的zlog.c里面已的zlog_output()和dzlog_output()代码的相似性很高,如果再分的话就有点难看了,看来也只能再度分化,把类似的代码再分,形成4个内部函数,不过这个改变要在下一版本出现。目前你的情况就先改着用下吧。

0
y
yfn020
恩,编译通了。好像hdzlog这个函数没有调用,是以后扩充需要的吗?
0
难易
难易

不是扩充,

当时是为了内部接口统一,尽量少写重复的代码

所以在hzlog里面这个参数实际是不需要的

0
难易
难易

题外话,zlog为了提高性能,是以空间换时间,

开发的时候我想现在的内存便宜,即使是嵌入式平台也有很多内存

每个进程可能会有2-3MB的内存占用,不知道你的平台内存是否足够?

期待你的运行结果,呵呵

0
y
yfn020
zlog会产生多少个进程呢?就是zlog最大会占用的内存是多少呢?
0
y
yfn020
hzlog这个函数没有被调用,hzlog应该是内部函数,我感觉应该会被调用,要不就是接口函数吧?我这样理解可以不?
0
难易
难易

zlog本身不产生进程,看用户程序的进程或者线程有多少。

hzlog是接口函数,不过va_list参数对hzlog是不必要的。

0
y
yfn020

哦,明白了,谢谢你。那6个线程大慨就需要18M的内存了咯?对我想运行的环境是一个压力啊!

返回顶部
顶部