Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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++ 构建共享对象-在windows上使用ninja works在osx和ubuntu上编译_C++_Kotlin_Java Native Interface_Chromium_Ninja - Fatal编程技术网

C++ 构建共享对象-在windows上使用ninja works在osx和ubuntu上编译

C++ 构建共享对象-在windows上使用ninja works在osx和ubuntu上编译,c++,kotlin,java-native-interface,chromium,ninja,C++,Kotlin,Java Native Interface,Chromium,Ninja,我正在尝试使用 我创建了一个小班,它将答案从C++库转换为缓冲区。< /强> void detect(long ptr, const char *text, const char *into) { NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr; NNetLanguageIdentifier::Result res = nptr->FindLanguage(text); long

我正在尝试使用

<强>我创建了一个小班,它将答案从C++库转换为缓冲区。< /强>

void detect(long ptr, const char *text, const char *into) {

    NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr;
    NNetLanguageIdentifier::Result res = nptr->FindLanguage(text);

    long current = (long) into;

    *((float *) current) = res.probability;
    current += sizeof(float);
    *((float *) current) = res.proportion;
    current += sizeof(float);
    *((short *) current) = res.is_reliable;
    current += sizeof(short);
    *((int *) current) = res.language.size();
    current += sizeof(int);

    memccpy(reinterpret_cast<void *>(current), res.language.c_str(), res.language.size() + 1, sizeof(res.language));
我设法使用

并创建了so和dylib文件:

一切正常

我正在尝试使用编译其他操作系统时使用的相同代码在windows上创建共享对象,但出现以下错误:

../../third_party/cld_3/src/src/Cld3LangDetector.cc(19,36): error: cast to 'chrome_lang_id::NNetLanguageIdentifier *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr;
                                   ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(25,36): error: cast to 'chrome_lang_id::NNetLanguageIdentifier *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr;
                                   ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(31,7): error: cast to 'float *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((float *) current) = res.probability;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(33,7): error: cast to 'float *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((float *) current) = res.proportion;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(35,7): error: cast to 'short *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((short *) current) = res.is_reliable;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(37,7): error: cast to 'int *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((int *) current) = res.language.size();
      ^
我已经试着将cflags传递给忍者版本

我很高兴知道如何解决这个问题,也很高兴理解为什么其他操作系统会容忍这个错误


谢谢。

long
不是存储指针值的合适类型。在64位Windows上,
long
通常仅为32位。您应该使用保证足够大的
::std::uintpttr\u t

long
不是存储指针值的合适类型。在64位Windows上,
long
通常仅为32位。您应该使用保证足够大的
::std::uintpttr\u t

我还要补充一点,所有指针运算都是在错误转换为
long
的结果上进行的,它们有一股难闻的代码味道,当然,我喜欢一系列严格的别名冲突。我还要补充一点,所有指针运算都是在错误转换为
long
的结果上进行的,都有一种难闻的代码味道,当然,我喜欢一系列严格的别名冲突。
../../third_party/cld_3/src/src/Cld3LangDetector.cc(19,36): error: cast to 'chrome_lang_id::NNetLanguageIdentifier *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr;
                                   ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(25,36): error: cast to 'chrome_lang_id::NNetLanguageIdentifier *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr;
                                   ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(31,7): error: cast to 'float *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((float *) current) = res.probability;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(33,7): error: cast to 'float *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((float *) current) = res.proportion;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(35,7): error: cast to 'short *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((short *) current) = res.is_reliable;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(37,7): error: cast to 'int *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((int *) current) = res.language.size();
      ^