我是在node.js中编写C++插件的新手。

这是我的模块:

$ npm install simpleini

它基于miniini-0.9。我的消息源在src/simpleIni.cc下。
我已经在Windows,OS X,Linux(Debian)下尝试了此模块。
它在Windows和OS X下都可以正常运行。

但是当我在Linux中运行时,似乎:
node: symbol lookup err: .../simpleIni.node: undefined symbol: _ZNK10INISection10ReadStringEPKcRS1_

为什么?

最佳答案

经过一番搜索,这就是我所发现的。

正在做:

$ nm -C build/Release/simpleIni.node  | grep ReadString
                 U INISection::ReadString(char const*, char const*&) const
00000000000032b0 t INISection::ReadString(char const*, char const*&) const [clone .part.11]
0000000000003f80 W INISection::ReadString(std::string const&, std::string&) const
00000000000081a0 T INISection::ReadStrings(char const*, char const**, unsigned int) const
0000000000008f20 T INISection::ReadStrings(std::string const&, std::vector<std::string, std::allocator<std::string> >&) const
000000000000bca0 r INISection::ReadString(char const*, char const*&) const::__PRETTY_FUNCTION__
000000000000b8a0 r INISection::ReadStrings(char const*, char const**, unsigned int) const::__PRETTY_FUNCTION__

所以关键是
                 U INISection::ReadString(char const*, char const*&) const

看起来好像是未定义的...尽管该符号还有另一个副本
00000000000032b0 t INISection::ReadString(char const*, char const*&) const [clone .part.11]

现在我们可以在您的代码中搜索此方法:

在src/miniini-0.9/miniini/include/inisection.h
class INISection
{
...
        bool ReadString(const char * const name, const char * & out) const;
}

并在src/miniini-0.9/miniini/src/inisection.cpp中
inline bool INISection::ReadString(const char * name, const char * & out) const
{
...
}

现在的关键是这个内联。根据C++常见问题解答How do you tell the compiler to make a member function inline?



从inisection.cpp删除内联
并重建,我们可以再试一次
$ nm -C build/Release/simpleIni.node  | grep ReadString
00000000000069a0 T INISection::ReadString(char const*, char const*&) const
0000000000003f70 W INISection::ReadString(std::string const&, std::string&) const
00000000000080e0 T INISection::ReadStrings(char const*, char const**, unsigned int) const
0000000000008d20 T INISection::ReadStrings(std::string const&, std::vector<std::string, std::allocator<std::string> >&) const
000000000000bc20 r INISection::ReadString(char const*, char const*&) const::__PRETTY_FUNCTION__
000000000000b7e0 r INISection::ReadStrings(char const*, char const**, unsigned int) const::__PRETTY_FUNCTION__

这次没有 undefined symbol ,并且ReadString仅出现一次。

关于javascript - Linux下的node.js C++插件中 undefined symbol ,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22868307/

10-10 14:40