【问题标题】:Compiling native C++ module for Node.js, linking to openSSL/libcrypto fails为 Node.js 编译本机 C++ 模块,链接到 openSSL/libcrypto 失败
【发布时间】:2011-06-16 23:49:03
【问题描述】:

我正在使用 Cygwin/Windows,我正在尝试为 node.js 构建一个本机模块。我打算使用 OpenSSL 库。我已经从 Cygwin 包管理器安装了 openssl。

我的 .cc 文件中有以下几行:

#include <openssl/dh.h>

 DH*    public_dh_key = DH_new();

但是当我尝试使用node-waf configure build 链接/编译它时,我得到:

undefined reference to _DH_new

编辑:

部分构建脚本:

def build(bld):
  ppp= bld.new_task_gen('cxx', 'shlib', 'node_addon')
  ppp.cxxflags = ["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall", "-L/usr/lib", "-lssl"]
...

(我尝试添加 -lcrypto 但仍然得到相同的结果。我还尝试了 "-lssl32","-lssleay32","-llibeay32" 的各种组合。)

编辑

构建脚本的输出:

$ node-waf configure build
Checking for program g++ or c++          : /usr/bin/g++
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for g++                         : ok
Checking for node path                   : not found
Checking for node prefix                 : ok /usr/local
'configure' finished successfully (0.330s)
Waf: Entering directory `/usr/src/build'
[1/2] cxx: ppp.cc -> build/default/ppp_1.o
[2/2] cxx_link: build/default/ppp_1.o -> build/default/ppp.node build/default/libppp.dll.a
Creating library file: default/libppp.dll.a
default/ppp_1.o:/usr/src/build/../ppp.cc:289: undefined reference to `_HMAC'
collect2: ld returned 1 exit status
Waf: Leaving directory `/usr/src/build'
Build failed:  -> task failed (err #1):
        {task: cxx_link ppp_1.o -> ppp.node,libppp.dll.a}

编辑

我在 usr/include/openssl 中有头文件 dh.h

我在 /usr/lib/ 中有所需的文件(libssl32.dll、libeay32.dll 和 ssleay32.dll)

答案

jHackTheRipper 回答了这个问题并因此获得了荣誉,但最终的答案隐藏在他的答案下方的 cmets 中。总而言之,waf 的口头禅是

obj.lib='crypto'

【问题讨论】:

  • 你能显示一些代码吗?回来的错误是什么?您是否按照api 中所述在发送前检查NetGroup.Neighbor.Connect

标签: c++ node.js cygwin openssl waf


【解决方案1】:

添加 -lcrypto 应该可以解决问题。
根据我系统上的nm 输出_DH_new_HMAC 似乎在libcrypto(OpenSSL 的一部分)动态库中:

jhacktheripper@macbook-prolocal:~$ nm /usr/lib/libcrypto.dylib | grep _DH_new
0000000000036360 T _DH_new
0000000000036120 T _DH_new_method


jhacktheripper@macbook-prolocal:~$ nm /usr/lib/libcrypto.dylib | grep HMAC
0000000000090d40 T _HMAC
0000000000090c80 T _HMAC_CTX_cleanup
0000000000090910 T _HMAC_CTX_init
00000000000908c0 T _HMAC_CTX_set_flags
0000000000090940 T _HMAC_Final
0000000000090cc0 T _HMAC_Init
0000000000090a10 T _HMAC_Init_ex
0000000000090a00 T _HMAC_Update

【讨论】:

  • 我已经尝试过了,但似乎没有任何区别:["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall", "-L/usr/lib", "-lssl","-lcrypto"]
  • 您的日志显示您正在尝试构建一个静态库default/libppp.dll.a,因此它需要具有与libcrypto 等效的静态库才能构建。
  • 那会是 libcrypto.dll.a 吗?那应该在哪里?我需要修改构建文件吗?
  • 是的,这就是我建议的原因。如果您自己构建 openssl,您可能能够再次静态构建它,这样您将获得所有静态 .a 库 (libcrypto.a)。然后你必须修改你的构建文件,但我不知道你正在使用的工具(waf)。
  • 谷歌搜索后,您应该可以使用带有obj.uselibobj.uselib_local 选项的libcrypto.a。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多