osx mountain lion — код C ++ прекрасно компилируется с обычным движком V8, не может быть собран с V8, предоставленным Node

Makefile:

CC:=g++
OUTFILE?=addon
SOURCE?=src
CFLAGS+=-Iinclude -lv8 -m64

.PHONY: all clean

all:
$(CC) $(CFLAGS) -o $(OUTFILE) `ls $(SOURCE)/*.cc`

clean:
rm -f $(OUTFILE)

addon.h:

#ifndef __addon_h
#define __addon_h#define BUILDING_NODE_EXTENSION
#define ADDON_VERSION "0.0.1"

#ifdef BUILDING_NODE_EXTENSION
#include <node/node.h>
#include <node/v8.h>
#else
#include <v8.h>
#endifusing namespace v8;

void init(Handle<Object> exports);
Handle<Object> setupExports(Handle<Object> exports);

#endif

addon.cc:

#include <cstdlib>
#include <cstdio>
#include <addon.h>

using namespace v8;

#ifndef BUILDING_NODE_EXTENSION
int main(int argc, char **argv) {
Isolate *isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
Handle<Context> context = Context::New(isolate);
Context::Scope context_scope(context);
Handle<Object> exports = Object::New();
init(exports);

printf("Version: %s\n", *String::Utf8Value(exports->Get(String::New("version"))));
return 0;
}
#else
int main() {
printf("This is a module compiled for Node.\nPlease use require in Node to use this file.\n");
return 0;
}
#endif

void init(Handle<Object> exports) {
setupExports(exports);
}

Handle<Object> setupExports(Handle<Object> exports) {
// Set version number.
exports->Set(String::New("version"), String::New(ADDON_VERSION));

return exports;
}#ifdef BUILDING_NODE_EXTENSION
NODE_MODULE(addon, init)
#endif

При компиляции вышеуказанного кода с обычным движком V8 без BUILDING_NODE_EXTENSION определено, результат — это то, что мы ожидаем:

 ❱ make && ./addon
g++ -Iinclude -lv8 -m64 -o addon `ls src/*.cc`
Version: 0.0.1

При компиляции с BUILDING_NODE_EXTENSION определяется с использованием узлов <node/node.h> а также <node/v8.h> для включает вместо нормального <v8.h>Я получаю это:

 ❱ make && ./addon
g++ -Iinclude -lv8 -m64 -o addon `ls src/*.cc`
Undefined symbols for architecture x86_64:
"v8::String::New(char const*, int)", referenced from:
setupExports(v8::Handle<v8::Object>)       in ccRntYkS.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [all] Error 1

Кто-нибудь есть идеи, что здесь происходит?

0

Решение

Здание с node-gyp решил проблему.

Лицо. Пальма.

Изменение Makefile:

CC:=g++
OUTFILE?=addon
SOURCE?=src
CFLAGS+=-Iinclude -lv8 -m64

.PHONY: all clean

all:
if [ -d build ]; then \
node-gyp build; \
else \
$(CC) $(CFLAGS) -o $(OUTFILE) `ls $(SOURCE)/*.cc`; \
fi;

clean:
rm -f $(OUTFILE)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]