Discussion:
Undefined symbol on node.js addon
Luís Miranda
2013-06-22 09:57:01 UTC
Permalink
I'm trying to create some node.js addons. Inside the addon i have a call to
a static lib. Everything compiles ok, but when i call my addon function
from javascript, i get the following:


* module.js:356*
* Module._extensions[extension](this, filename);*
* ^*
* Error: /home/.../Projects/NodeAddonComLibTest/build/Debug/addon.node:
undefined symbol: _Z6ctest1Pi*
* at Module.load (module.js:356:32)*
* at Function.Module._load (module.js:312:12)*
* at Module.require (module.js:364:17)*
* at require (module.js:380:17)*
* at Object.<anonymous>
(/home/.../Projects/NodeAddonComLibTest/doTest.js:1:75)*
* at Module._compile (module.js:456:26)*
* at Object.Module._extensions..js (module.js:474:10)*
* at Module.load (module.js:356:32)*
* at Function.Module._load (module.js:312:12)*
* at Function.Module.runMain (module.js:497:10)*


My addon code is the following:

* #include <iostream>*
* #include <string.h>*
* #include <stdlib.h>*
*
*
* #include <node.h>*
* #include <v8.h>*
*
*
* using namespace v8;*
* using namespace std;*
*
*
* void ctest1(int *);*
*
*
* Handle<Value> setPort(const Arguments& args){*
* HandleScope scope;*
*
*
* if (args.Length() != 1) {*
* ThrowException(Exception::TypeError(String::New("Wrong number of
arguments.")));*
* return scope.Close(Undefined());*
* }*
*
*
* // =========================*
* printf("Calling static lib...\n");*
* int x=0;*
* ctest1(&x);*
* printf("Val c=%d\n", x);*
* // =========================*
*
*
* return scope.Close(Number::New(args[0]->NumberValue()));*
* }*
*
*
* void Init(Handle<Object> exports) {*
* exports->Set(String::NewSymbol("show"),
FunctionTemplate::New(setPort)->GetFunction());*
* }*
*
*
* NODE_MODULE(addon, Init)*


Can someone help?

Thanks

(
http://stackoverflow.com/questions/17249378/undefined-symbol-on-node-js-addon
)
--
--
Job Board: http://jobs.nodejs.org/
Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs-/***@public.gmane.org
To unsubscribe from this group, send email to
nodejs+unsubscribe-/***@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/groups/opt_out.
Fedor Indutny
2013-06-22 10:07:02 UTC
Permalink
Post by Luís Miranda
ctest1
Where is ctest1 declared?

Cheers,
Fedor.
--
--
Job Board: http://jobs.nodejs.org/
Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs-/***@public.gmane.org
To unsubscribe from this group, send email to
nodejs+unsubscribe-/***@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/groups/opt_out.
Luís Miranda
2013-06-22 10:40:49 UTC
Permalink
ctest1 is defined in static lib in the same directory.
Post by Fedor Indutny
Post by Luís Miranda
ctest1
Where is ctest1 declared?
Cheers,
Fedor.
--
--
Job Board: http://jobs.nodejs.org/
Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs-/***@public.gmane.org
To unsubscribe from this group, send email to
nodejs+unsubscribe-/***@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/groups/opt_out.
Ben Noordhuis
2013-06-22 10:10:26 UTC
Permalink
Post by Luís Miranda
I'm trying to create some node.js addons. Inside the addon i have a call to
a static lib. Everything compiles ok, but when i call my addon function from
module.js:356
Module._extensions[extension](this, filename);
^
undefined symbol: _Z6ctest1Pi
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous>
(/home/.../Projects/NodeAddonComLibTest/doTest.js:1:75)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <node.h>
#include <v8.h>
using namespace v8;
using namespace std;
void ctest1(int *);
Handle<Value> setPort(const Arguments& args){
HandleScope scope;
if (args.Length() != 1) {
ThrowException(Exception::TypeError(String::New("Wrong number of
arguments.")));
return scope.Close(Undefined());
}
// =========================
printf("Calling static lib...\n");
int x=0;
ctest1(&x);
printf("Val c=%d\n", x);
// =========================
return scope.Close(Number::New(args[0]->NumberValue()));
}
void Init(Handle<Object> exports) {
exports->Set(String::NewSymbol("show"),
FunctionTemplate::New(setPort)->GetFunction());
}
NODE_MODULE(addon, Init)
Can someone help?
Thanks
(http://stackoverflow.com/questions/17249378/undefined-symbol-on-node-js-addon)
Where is ctest1 defined? And more importantly: how?

It currently has C++ linkage (hence the mangled name.) If it's a
symbol from a C library, declare it with `extern "C"`.

You mention it's a static library. Have you verified that the symbol
actually gets compiled into the .node file? `nm file.node | grep
ctest1` should print the symbol name, prefixed by a T or t.
--
--
Job Board: http://jobs.nodejs.org/
Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs-/***@public.gmane.org
To unsubscribe from this group, send email to
nodejs+unsubscribe-/***@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/groups/opt_out.
Luís Miranda
2013-06-22 10:41:19 UTC
Permalink
I was missing extern "C". Thanks for helping.
Post by Luís Miranda
Post by Luís Miranda
I'm trying to create some node.js addons. Inside the addon i have a call
to
Post by Luís Miranda
a static lib. Everything compiles ok, but when i call my addon function
from
Post by Luís Miranda
module.js:356
Module._extensions[extension](this, filename);
^
undefined symbol: _Z6ctest1Pi
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous>
(/home/.../Projects/NodeAddonComLibTest/doTest.js:1:75)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <node.h>
#include <v8.h>
using namespace v8;
using namespace std;
void ctest1(int *);
Handle<Value> setPort(const Arguments& args){
HandleScope scope;
if (args.Length() != 1) {
ThrowException(Exception::TypeError(String::New("Wrong number of
arguments.")));
return scope.Close(Undefined());
}
// =========================
printf("Calling static lib...\n");
int x=0;
ctest1(&x);
printf("Val c=%d\n", x);
// =========================
return scope.Close(Number::New(args[0]->NumberValue()));
}
void Init(Handle<Object> exports) {
exports->Set(String::NewSymbol("show"),
FunctionTemplate::New(setPort)->GetFunction());
}
NODE_MODULE(addon, Init)
Can someone help?
Thanks
(
http://stackoverflow.com/questions/17249378/undefined-symbol-on-node-js-addon)
Where is ctest1 defined? And more importantly: how?
It currently has C++ linkage (hence the mangled name.) If it's a
symbol from a C library, declare it with `extern "C"`.
You mention it's a static library. Have you verified that the symbol
actually gets compiled into the .node file? `nm file.node | grep
ctest1` should print the symbol name, prefixed by a T or t.
--
--
Job Board: http://jobs.nodejs.org/
Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs-/***@public.gmane.org
To unsubscribe from this group, send email to
nodejs+unsubscribe-/***@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/groups/opt_out.
Loading...