1

私は、すべて共通のフレームワークに依存するいくつかのマルチプラットフォーム プロジェクトに取り組んでいます。Google Native-Client (NaCl) のサポートを追加したいです。私が問題にアプローチした方法は、最初にフレームワークを静的ライブラリとしてコンパイルすることです (これは、他のすべてのプラットフォームで行ってきた方法です)。

私はこれまで SCons を使用したことがないと言わざるを得ません。私はそれを理解し始めていると思います。チュートリアルの build.scons から始めて、コードのコンパイルとリンクを取得できます。ここで、リンク プロセスをスキップしたいと思いますが、nacl_env は静的ライブラリをコンパイルすることを意図したものではないようです。

Library ノードが nacl_env にないため、SCons ヘルプを読んでもあまり役に立ちませんでした。

ビルドプロセス全体を最初から書くほど 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 = False、
  • LIBS = ['web2grid_framework'、'srpc']、
  • LIBPATH = ['../../../ bin / lib / lib32'、'../../../bin/lib/lib64']、
  • LINKFLAGS = ['-pthread']

これがクリーンな方法だと言っているのではありませんが、それで仕事は終わります。

于 2011-12-22T23:01:57.950 に答える
0

ここで 2 つの質問があります
。 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 モジュールをコンパイルする方法の詳細については、 SCONSを使用する場合と使用しない場合のコンパイル方法について詳しく説明しているコンパイルに関するドキュメント @ gonacl.com を参照してください。

2.GCC を使用した静的ライブラリのコンパイル
ここに例を示します: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

~メイン

于 2011-12-16T14:38:41.043 に答える