c++ - 错误LNK2001 : unresolved external symbol in C++ with Node-Gyp

标签 c++ node.js json node-gyp

您好,我是 C++ 新手,一直在使用 node-gyp 为我的一个程序构建一个插件。但是,当我尝试构建插件时遇到此错误:

watercpp.obj : error LNK2001: unresolved external symbol "class std::basic_istr
eam<char,struct std::char_traits<char> > & __cdecl Json::operator>>(class std::
basic_istream<char,struct std::char_traits<char> > &,class Json::Value &)" (??5
Json@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@std@@AEAV12@AEAVValue@0@@Z)

我认为这与从 JSON 访问信息的引用错误有关。这就是我的代码的样子:

#include "node.h"
#include "node_buffer.h"
#include "v8.h"
#include <value.h>
#include <fstream>
#include <iostream>
#include <string>
#include <json/json.h>
#include <vector>

using namespace v8;
using namespace std;

namespace water{
    using v8::FunctionCallbackInfo;
    using v8::Isolate;
    using v8::Local;
    using v8::Object;
    using v8::String;
    using v8::Number;
    using v8::Value;
    using v8::Array;

    void water(const FunctionCallbackInfo<Value> &args)
    {
        Json::Value waterjson;
        std::ifstream people_file("waterjson.json", std::ifstream::binary);
        people_file >> waterjson;
        Local<Array> a;
        Local<Array> b;
        if(args[0]->IsArray())
        {
           a = args[0].As<Array>();
           b = args[1].As<Array>();
        }
        int total=0;
        for(std::size_t i=0; i<a->Length(); i++)
        {
            v8::Isolate* isolate = args.GetIsolate();
            v8::String::Utf8Value atr(isolate, a->Get(i));
            std::string cppStr(*atr);

            int c = waterjson[cppStr]["content"].asInt();
            int s = waterjson[cppStr]["serving"].asInt();
            int m = s/100;
            int amount = c*m;
            v8::String::Utf8Value btr(isolate, b->Get(i));
            std::string cppNum(*btr);
            int num = stoi(cppNum);
            total+=(amount*num);
        }

        args.GetReturnValue().Set(total);
    }
    
    void Initialize(Local<Object> exports)
    {
        NODE_SET_METHOD(exports, "water", water);
    }
    NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
}

我不确定该怎么做,因为我以前从未见过这样的错误,而且网上几乎没有关于如何处理它的文档。谢谢!

这是我的绑定(bind).gyp:

{
    "targets":[
        {
            "target_name": "water",
            "sources": ["watercpp.cpp"],
            "include_dirs": [
                "./vcpkg/installed/x86-windows/include",
                "./vcpkg/buildtrees/jsoncpp/src/1.9.2-d01d7f5c9b.clean/include/json",
            ],
            "library_dirs":[
                "./vcpkg/buildtrees/jsoncpp/x86-windows-dbg/src/lib_json",
                "./vcpkg/installed/x86-windows/lib", "./vcpkg/packages/jsoncpp_x86-windows/lib",
            ],
            "libraries":[
                "-ljsoncpp.lib", "<(module_root_dir)/vcpkg/buildtrees/jsoncpp/x86-windows-dbg/src/lib_json",
                "<(module_root_dir)/vcpkg/installed/x86-windows/lib", "<(module_root_dir)/vcpkg/packages/jsoncpp_x86-windows/lib",


            ],
        },
    ]
}

最佳答案

您需要添加jsoncpp库到 binding.gyp 中的链接阶段:

"libraries": [
  "-L.", "-ljsoncpp"
],
  • -L<libdir> - 在其中查找库的目录。替换 .如果实际路径不在当前目录中,则使用实际路径。
  • -l<library> - 要链接的实际库。您可能需要指定完整的静态库名称 jsoncpp.lib相反,以避免出现问题 if jsoncpp.dll也存在。

关于c++ - 错误LNK2001 : unresolved external symbol in C++ with Node-Gyp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63383329/

相关文章:

android - JSON在android中合并两个响应

c++ - 使用 std::find 这种方式的正确性

javascript - Node.JS - 简单的 Socket.IO 示例不起作用。获取调试 - 提供静态内容/socket.io.js (Mac OSX/Localhost)

PHP:向 JSON 对象添加新的键值对

java - Spring MVC : Unable to get json value in jsp, 它给出 0

javascript - 如何以简单的方式将函数转换为 RequireJS 中的模块?

c++ - 使用列表而不是值范围的 uniform_int_distribution

c++ - 如何将 XML 节点转换为 C++ 结构?

c++ - 函数调用后头文件导致原数组出现问题

node.js - 找不到将 leveldb 转储到平面文件的有效方法