本机客户端 curl 库链接

native client curl library linking

我正在尝试将本机客户端 (pNaCl) 与来自 naclports 的 curl 库一起使用。我有 NaCl SDK 版本 38,我正在使用 naclports 的 pepper_38 分支。成功构建 curl 库后,我将 header 包含在我的项目中并使用 pnacl 工具链执行 "make"。如果只包含 header 一切顺利,但是一旦我尝试使用库中的 curl 函数,我就会在该库中遇到大量 "undefined reference" 错误:

/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'sigaction'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'recv'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'getsockname'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'bind'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'getsockopt'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'socket'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'connect'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'htons'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'getpeername'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'inet_pton'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'ntohs'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'inet_ntop'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'setsockopt'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'poll'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'send'
/nacl_sdk/pepper_38/toolchain/linux_pnacl/usr/local/lib/libcurl.a: error: undefined reference to 'inflate'

我对 NaCl 完全陌生,所以任何提示都会非常有帮助。

您的 link 行似乎缺少一些库。特别是,其中大多数似乎是套接字调用。这些函数在 nacl_io 库中定义。

在大多数工具链中,这些函数都在您的 C 库中定义,因此您不必 link 任何其他库。但是在NaCl中(使用newlib库时),有很多缺失的函数是nacl_io.

添加的

看来您还需要 inflate,它来自 zlib 库。所以你的新 link 行应该是这样的:

<other link args> -lcurl -lz -lnacl_io -lppapi

libppapi.a 是必需的,因为 nacl_io 库使用它。

所以我终于成功地编译了我的项目。最后归结为库链接的顺序。工作顺序如下:ppapi_cpp ppapi pthread curl ssl crypto z nacl_io。前 3 个已在示例项目中,其他已添加。