1

我正在开发一些都依赖于通用框架的多平台项目。我想添加对 Google Native-Client (NaCl) 的支持。我解决问题的方法是首先将框架编译为静态库(这就是我在所有其他平台上一直这样做的方式)。

我不得不说我以前从未使用过 SCons。我想我开始掌握它了。从教程中的 build.scons 开始,我可以获得一些代码编译和链接。现在我想跳过链接过程,但似乎 nacl_env 从未打算编译静态库。

阅读 SCons 帮助对我没有多大帮助,因为 nacl_env 中缺少 Library 节点。

我认为我对 SCons 的了解不足以从头开始编写整个构建过程,所以我希望不必这样做。

1. 我是否正确地解决了问题?

2. 使用 SCons 构建的任何提示或示例 nacl 静态库?

4

2 回答 2

2

好的,我所做的比您可能需要的要复杂得多。

我希望我的静态库处理 NaCl 模块的初始化步骤,然后调用一些特定于项目的函数。

我最终把我的整个框架和内置 libppapi_cpp.a 的内容变成了一个 .o 文件,然后变成了一个 .a 文件,一个静态库。

我需要一个 .o 文件,否则我会遇到与初始化相关的依赖问题,我无法解决。

build_lib.sh(框架):

#!/bin/bash -e

SDK="/home/kalmi/ik/nacl_sdk/pepper_15"

function create_allIn_a {
TMPDIR="`mktemp -d`"
  echo $TMPDIR
  cp $O_FILES $TMPDIR
  pushd $TMPDIR &> /dev/null
  $AR x $LIBPPAPI_CPP_A
  $LD -Ur * -o ALL.o
  $AR rvs $OUTPUT_NAME ALL.o
  $RANLIB $OUTPUT_NAME
  popd &> /dev/null
}

./scons


BIN_BASE="$SDK/toolchain/linux_x86/bin"
LD="$BIN_BASE/i686-nacl-ld"
AR="$BIN_BASE/i686-nacl-ar"
RANLIB="$BIN_BASE/i686-nacl-ranlib"
LIBPPAPI_CPP_A="$SDK/toolchain/linux_x86_newlib/x86_64-nacl/lib32/libppapi_cpp.a"
O_FILES="`find $(pwd)/opt_x86_32 | grep .o$ | grep --invert-match my_main.o | tr "\n" " "`"
LIBDIR="../../../bin/lib/lib32"
mkdir -p $LIBDIR
if [ -f $LIBDIR/libweb2grid_framework.a ]; then
  rm $LIBDIR/libweb2grid_framework.a
fi
OUTPUT_NAME="`readlink -m $LIBDIR/libweb2grid_framework.a`"
create_allIn_a


BIN_BASE="$SDK/toolchain/linux_x86/bin"
LD="$BIN_BASE/x86_64-nacl-ld"
AR="$BIN_BASE/x86_64-nacl-ar"
RANLIB="$BIN_BASE/x86_64-nacl-ranlib"
LIBPPAPI_CPP_A="$SDK/toolchain/linux_x86_newlib/x86_64-nacl/lib64/libppapi_cpp.a"
O_FILES="`find $(pwd)/opt_x86_64 | grep .o$ | grep --invert-match my_main.o | tr "\n" " "`"
LIBDIR="../../../bin/lib/lib64"
mkdir -p $LIBDIR
if [ -f $LIBDIR/libweb2grid_framework.a ]; then
  rm $LIBDIR/libweb2grid_framework.a
fi
OUTPUT_NAME="`readlink -m $LIBDIR/libweb2grid_framework.a`"
create_allIn_a

 ./scons -c

my_main.o 文件已从静态库中排除,因为该文件包含将由使用此框架的项目提供的函数。

框架的build.scons文件真的很普通。

build.scons(对于一些使用这个框架的项目):

#! -*- python -*-

#What to compile:
sources = [ 'src/something.cpp', 'src/something_helper.cpp' ]


###############################################################x

import make_nacl_env
import nacl_utils
import os

nacl_env = make_nacl_env.NaClEnvironment(
    use_c_plus_plus_libs=False,
    nacl_platform=os.getenv('NACL_TARGET_PLATFORM'))

nacl_env.Append(
    # Add a CPPPATH that enables the full-path #include directives, such as
    # #include "examples/sine_synth/sine_synth.h"
    CPPPATH=[os.path.dirname(os.path.dirname(os.path.dirname(os.getcwd())))],
    LIBS=['web2grid_framework','srpc'],
    LIBPATH=['../../../bin/lib/lib32','../../../bin/lib/lib64'],
    LINKFLAGS=['-pthread']
   )

nacl_env.AllNaClModules(sources, 'client')

一些值得强调的行:

  • use_c_plus_plus_libs=假,
  • LIBS=['web2grid_framework','srpc'],
  • LIBPATH=['../../../bin/lib/lib32','../../../bin/lib/lib64'],
  • LINKFLAGS=['-pthread']

我并不是说这是一种干净的方法,但它可以完成工作。

于 2011-12-22T23:01:57.950 回答
0

所以,这里有两个问题
1. 使用 SCONS:
NaCl 使用 SCONS 作为示例,只是为了帮助更轻松地编译示例。实际上,SCONS 只是指向 SDK 构建目录中的 GCC/G++ 编译器。(SCONS 将接受输入脚本,并创建最终的参数字符串以发送到 GCC)

GCC 是一个常见的编译器,并且在网上有很好的记录:http: //gcc.gnu.org/

如何将 NaCl 编译集成到您的工作流程中取决于您(即您不必被迫使用 SCONS)。

例如,如果您想直接访问 GCC,您可以简单地调用:
<path to bin>/x86_64-nacl-gcc -m64 -o test.nexe main.c

要更详细地了解如何编译 NaCl 模块,请阅读关于编译的文档 @ gonacl.com,该文档将详细说明如何使用和不使用 SCONS 进行编译。

2.使用 GCC 编译静态库
这是一个例子: http: //www.adp-gmbh.ch/cpp/gcc/create_lib.html

~主要

于 2011-12-16T14:38:41.043 回答