Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译本机C++;Node.js的模块,链接到openSSL/libcrypto失败_C++_Node.js_Cygwin_Openssl_Waf - Fatal编程技术网

C++ 编译本机C++;Node.js的模块,链接到openSSL/libcrypto失败

C++ 编译本机C++;Node.js的模块,链接到openSSL/libcrypto失败,c++,node.js,cygwin,openssl,waf,C++,Node.js,Cygwin,Openssl,Waf,我正在使用Cygwin/Windows,并试图为node.js构建一个本机模块。我打算使用OpenSSL库。我已经从Cygwin软件包管理器安装了openssl 我的.cc文件中有以下行: #include <openssl/dh.h> 但是,当我尝试使用节点waf configure build链接/编译它时,我得到: undefined reference to _DH_new 编辑: 构建脚本的一部分: def build(bld): ppp= bld.new_task

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

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

#include <openssl/dh.h>
但是,当我尝试使用
节点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"]
...
$ 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}
(我尝试添加-lcrypto,但仍然得到相同的结果。我还尝试了“-lssl32”、“-lsslay32”、“-llibeay32”的各种组合。)

编辑

生成脚本的输出:

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"]
...
$ 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)/

答案

查克瑟利普回答了这个问题,并因此获得了荣誉,但最终的答案隐藏在他答案下面的评论中。总而言之,waf的咒语是

obj.lib='crypto'

添加
-lcrypto
就可以了。
根据我的系统上的
nm
输出
\u DH\u new
\u 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

添加
-lcrypto
就可以了。
根据我的系统上的
nm
输出
\u DH\u new
\u 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

你能展示一些代码吗?返回时出现了什么错误?是否在发送前检查
NetGroup.Neighbor.Connect
,如中所示?是否可以显示一些代码?返回时出现了什么错误?您是否在发送前检查
NetGroup.Neighbor.Connect
,如中所示?我已经尝试过,但似乎没有任何区别:
[“-g”、“-D_文件偏移量_位=64”、“-D_大文件_源”、“-Wall”、“-L/usr/lib”、“-lssl”、“-lcrypto”]
您的日志显示您正在尝试构建一个静态库
default/libppp.dll.a
,因此它需要一个与
libcrypto
等价的静态库才能构建。这是libcrypto.dll.a吗?那应该在哪里?我需要修改构建文件吗?是的,这就是我建议的原因。如果您自己构建openssl,您可能能够静态地再次构建它,这样您就可以获得所有的static.a库(
libcrypto.a
)。然后你必须修改你的构建文件,但我不知道你正在使用的工具(waf)。在谷歌搜索之后,你应该能够将libcrypto.a与
obj.uselib
obj.uselib\u local
选项一起使用。我已经试过了,但似乎没有任何区别:
[“-g”,“-D\u file\u OFFSET\u BITS=64”,“-D\u LARGEFILE\u SOURCE”,“-Wall”、“-L/usr/lib”、“-lssl”、“-lcrypto”]
您的日志显示您正在尝试构建一个静态库
default/libppp.dll.a
,因此它需要有一个与
libcrypto
等价的静态库才能构建。那是libcrypto.dll.a吗?应该在哪里?我需要修改构建文件吗?是的,这就是我建议的原因。如果您自己构建openssl,您可以可能可以静态地重新构建它,这样您就可以获得所有的静态.a库(
libcrypto.a
)。然后您必须修改构建文件,但我不知道您正在使用的工具(waf)。在谷歌搜索之后,您应该能够使用libcrypto.a和
obj.uselib
obj.uselib\u local
选项。