4

C++ プロジェクトにnode.hを含める必要があります 。以下を使用してソース コードからノードをビルドしようとしました。

./configure
sudo make

ノード実行可能ファイルといくつかのオブジェクト ファイルと .a ファイルを取得しました。C++ コードで使用するには、.so ファイルとしてビルドする必要があります。

libnodeをビルドしようとしましたが、cmakelists エラーが発生しました。これは公式の nodejs プロジェクトではありません。

ソースコードからnodejsを.soファイルとして構築する方法を誰かが知っていれば、Googleグループの同様の質問ですが、答えはうまくいきません。

4

4 に答える 4

5

共有ライブラリとしてビルドするためのサポートがノードのメインラインに追加されました。PR 6994と、具体的にはこのコメントを参照してください。

私はただ走った

git clone https://github.com/nodejs/node.git
cd node
git checkout v6.9.4
./configure --shared
make -j4

生産:

ubuntu@server:~/node$ find . -name libnode.so\* -exec ls -la {} \;
-rwxrwxr-x 2 ubuntu ubuntu 31576776 Jan  6 18:57 ./out/Release/lib.target/libnode.so.48
-rw-rw-r-- 1 ubuntu ubuntu 387 Jan  6 18:57 ./out/Release/.deps/home/ubuntu/node/out/Release/lib.target/libnode.so.48.d
-rw-rw-r-- 1 ubuntu ubuntu 4202 Jan  6 18:57 ./out/Release/.deps/home/ubuntu/node/out/Release/obj.target/libnode.so.48.d
-rwxrwxr-x 2 ubuntu ubuntu 31576776 Jan  6 18:57 ./out/Release/obj.target/libnode.so.48
ubuntu@server:~/node$ 
于 2017-01-06T19:26:56.380 に答える
4

共有には「-fpic」を追加する必要があるため、静的ライブラリで構築する方が簡単だと思います。

私のプロジェクト (Linux 環境) では、このスクリプトを使用して静的な node.js ライブラリを構築します。

#!/bin/sh
# This script is LGPL feel free to use it!

if test ! "$#" = "1"; then
    echo "Run with the archive in parameter:"
    echo "\t${0} ./node-v0.XX.XX.tar.gz"
    echo "\nIt will build a ./libnode_static.a in current dir"
    return
fi

HERE=$PWD

#Extract Tarball
tar xf $1 | exit 1 
DIRNAME=`echo $1 | sed s/.tar.gz//g`

cd $DIRNAME

#Patch node.gyp to build in static
sed -i "s/'type': 'executable',/'type': 'static_library',/g" ./node.gyp 

#Patch node_main.cc to rename the main in node_main
sed -i "s/int main(/int node_main(/g" ./src/node_main.cc

#Build Node.js
./configure
make -j8

#Move to build directory
cd ./out/Release

#Extract .a

#Cleanup if previous build
rm -fr *.tmpd

echo "== Extracting *.a =="

#Make sure we create a directory
#for each.a as some .o might
#have the same name
for a in `ls *.a`
do
    echo "\t${a}..."
    mkdir "$a.tmpd"
    cd "$a.tmpd"
    ar x ../$a
    cd ..
done

#Repack in a single .a
find . -iname "*.o" | xargs ar rcs libnode_static.a

#Cleanup
rm -fr *.tmpd

echo "==      DONE      =="

#Move in start directory
mv ./libnode_static.a ${HERE}/

cd ${HERE}

#Sanity CHECK
echo "== Performing Sanity Check =="

TMP_FILE=`mktemp /tmp/XXXXXX.cxx`
TMP_EXE=`mktemp /tmp/XXXXXX`

cat << . > ${TMP_FILE}
int node_main( int argc, char **argv);
int main(int argc, char ** argv )
{
    node_main( argc, argv );
    return 0;
}
.

#Try compiling
g++  ${TMP_FILE} -o ${TMP_EXE} -lnode_static -ldl -pthread -L. 

#Try running
RET=`${TMP_EXE} -e "console.log('okfromnode')"` 

if test "x${RET}" = "xokfromnode"; then
    echo "== Sanity check OK =="
else
    echo "== Sanity check FAILED =="
    exit 1
fi

rm ${TMP_FILE} ${TMP_EXE}

echo "== Node.js is now built statically in ./libnode_static.a =="

exit 0

次のように実行します。

sh script.sh  node-v0.10.XX.tar.gz

すべてがうまくいけば、現在のディレクトリにlibnode_static.aを取得する必要があります。

次のようなコードで使用します。

int node_main( int argc, char **argv);

int main(int argc, char ** argv )
{
    /* Here we spawn a node.js instance */
    return node_main( argc, argv );
}

そして、次のようにコンパイルします。

g++ ./test.cxx -o ./my_node -lnode_static -ldl -pthread -L. 

そして、ノードが埋め込まれています:

./my_node  -e "console.log('Hello World')"
#Outputs
Hello World

お役に立てれば。

于 2014-09-20T11:30:33.533 に答える