正在链接jsoncpp(libjson)

Linking jsoncpp (libjson)

本文关键字:libjson jsoncpp 链接      更新时间:2023-10-16

我正在尝试使用cmake将jsoncpp(lib_json)与一个c++项目链接起来。它在一台计算机上运行得很好,但在另一台计算机(配置几乎相同)上,我在执行应用程序时出错:

dyld:未加载库:buildscons/linux-gcc-4.2.1/src/lib_json/libjson_linux-gcc-4.2_libmt.dylib

引用自:可执行的路径

原因:找不到图像

知道是什么原因造成的吗?我甚至不明白为什么它试图查找@buildscons/linux-gcc-4.2.1/src/lib_json/libjson_linux-gcc_4.21_librt.dylib,因为我把jsoncpp放在了usr/lib/中,并将名称改为libjsoncpp,然后cmake找到了正确的路径/库。

我还在两台计算机上以完全相同的方式构建了jsoncpp。

我也遇到了同样的问题。如果运行tool -L libjson_linux-gcc-4.2.1_libmt.dylib,您可以看到与libjson...的一些奇怪的相对地址。我想如果复制这个目录结构,它会起作用,但这是一个糟糕的解决方案。

相反,我使用了.alibjson_linux-gcc-4.2.1_libmt.a),并将其与二进制文件静态链接。在XCode中,简单地在Build Settings->Linking->Other Linker Flags下,我为我的.a添加了绝对路径。对我来说,这是/Users/martin/Downloads/jsoncpp-src-0.5.0/libs/linux-gcc-4.2.1/libjson_linux-gcc-4.2.1_libmt.a,仅此而已。

当然,我不知道你的用例,也许你真的需要动态链接它。

编辑:我现在明白了,你指的是libjson,而不是libjsonpp(它们不同!)

在你的滴度中,你谈到了jsoncpp,这就是这个答案的意义所在。但也许它对那些被滴度弄糊涂的人也有用。


您可以'合并'jsoncpp。

从jsoncpp源目录运行python amalgamate.py,创建:

dist/jsoncpp.cpp
dist/json/json.h
dist/json/json-forwards.h

现在,您必须编译jsoncpp.cpp一次,然后链接到生成的jsoncpp.o:

  1. g++ -o jsoncpp.o -c jsoncpp.cpp(仅一次)
  2. g++ -o executable jsoncpp.o main.cpp(每次)

如果出现错误,在包含json/json.h之前可能必须先使用#define JSON_IS_AMALGAMATION,但是。。。

我试过了,它对我有效。(没有#define JSON_IS_AMALGAMATION,也就是)

使用的代码:

#include "json/json.h"
#include "json/json-forwards.h"
int main(int argc, char *argv[])
{
    Json::Reader    reader;
    Json::Value     value;
    if (!reader.parse("{"hello":"world"}", value, false))
    {
        std::cerr << "ERROR: Couldn't parse Json: " << reader.getFormattedErrorMessages() << std::endl;
        return -1;
    }
    std::cout << value.toStyledString() << std::endl;
    return 0;
}