如何在此C示例代码中解析CPU符号?

时间:2013-11-06 19:45:09

标签: c linux gcc solaris autoconf

我在location.c中遇到了以下代码,用于apache jsvc java守护进程。

char *location_jvm_cfg[] = {
    "$JAVA_HOME/jre/lib/jvm.cfg",           /* JDK */
    "$JAVA_HOME/lib/jvm.cfg",               /* JRE */
    "$JAVA_HOME/jre/lib/" CPU "/jvm.cfg",   /* JDK */
    "$JAVA_HOME/lib/" CPU "/jvm.cfg",       /* JRE */
    NULL,
};

我仔细查看了源代码,发现在代码"$JAVA_HOME/jre/lib/" CPU "/jvm.cfg"中扩展了CPU宏,但找不到这样的MACRO定义。

我不确定CPU是否是C宏或其他正在配置autoconf工具的东西。

上述CPU值如何替代实际CPU值?

我面临的问题是,当我在Solaris上构建jsvc并将CFLAGSLDFLAGS设置为-m64时,生成的64位solaris二进制文件尝试从{{1}加载jvm .so文件而不是$JAVA_HOME/jre/lib/sparc/jvm.cfg

更新

使用以下命令行运行带有JSVC的./configure正确

$JAVA_HOME/jre/lib/sparcv9/jvm.cfg

额外configure --with-java=/path/to/jdk1.7.0_45 --host=sparcv9-sun-solaris2.10 CFLAGS="-m64" LDFLAGS="-m64" 会导致生成的gcc命令为

--host=sparcv9-sun-solaris2.10

而不是

gcc -m64 -DOS_SOLARIS -DDSO_DLFCN -DCPU=\"sparcv9\" -Wall -Wstrict-prototypes

这导致生成的64位jsvc二进制文件尝试链接32位so文件而不是64位so文件。

2 个答案:

答案 0 :(得分:3)

绝对必须是预处理器定义。在该代码中没有其他任何东西可以使用。

为了使配置使用不同的CPU,配置脚本可能需要configuration triplet。这可能看起来像'i686-unknown-gnu-linux'

显然configure.guess做了解决这个问题的工作。如果在configure命令行中指定其中一个三元组(四元组?),它可能认为它是在交叉编译器中构建的,但它应该可以工作。

答案 1 :(得分:1)

生成的configure脚本根据configure --host的值将-DCPU添加到CFLAGS,默认配置为--build,默认为猜测值。