LINUX.ORG.RU

Помогите с мануалом для переписывания Windows only библиотеке

 


0

1

Коллеги, пытаюсь подключить свой стороний код к проекту который собирался и есть в makefile для этого свои ifы

Но оно падает на windows specific вещах типо

/crypto/common.h: In function ‘uint16_t ReadLE16(const unsigned char*)’:
./crypto/common.h:22:12: error: ‘le16toh’ was not declared in this scope
  22 |     return le16toh(x);

Компилятор последний gcc , код на C++ 11 . Подскажите как это по правильному обойти ?

★★★★★

Последнее исправление: pinachet (всего исправлений: 2)

Ответ на: комментарий от ox55ff

Там ещё на другие он тоже жалуется ,для msvc у них специальный файл с define имя 0 есть . Вопрос тока какие из них не будут ломать код ?

pinachet ★★★★★
() автор топика
Ответ на: комментарий от ox55ff

Сек немного времени ,там NDA частично

pinachet ★★★★★
() автор топика
Ответ на: комментарий от vtVitus

Так оно и подключается

#include <assert.h>
#include <stdint.h>
#include <string.h>

#include <compat/endian.h>

uint16_t static inline ReadLE16(const unsigned char* ptr)
{
    uint16_t x;
    memcpy((char*)&x, ptr, 2);
    return le16toh(x);
}

Но все равно дает ошибку

In file included from ./uint256.h:15,
                 from ./consensus/params.h:9,
                 from ./chainparams.h:13,
                 from ldaemond.cpp:10:
./crypto/common.h: In function ‘uint16_t ReadLE16(const unsigned char*)’:
./crypto/common.h:22:12: error: ‘le16toh’ was not declared in this scope
   22 |     return le16toh(x);

pinachet ★★★★★
() автор топика
Ответ на: комментарий от pinachet

у меня твой пример с заменой #include <compat/endian.h> на #include <endian.h> компилируется без проблем. Так что проблема возможно в какой-то не шибко стандартном compat.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от vtVitus

А может быть такая проблема что в Fedora 30 не собирается , а в Ubuntu LTS оно собирается из-за каких то исходников?

pinachet ★★★★★
() автор топика
Ответ на: комментарий от vtVitus

Не он не собирается , у тебя какой gcc и дистр ?

Сама команда

g++ -std=c++11 -DHAVE_CONFIG_H -I. -I../src/config   -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -I. -I/usr/include/libdb4/ -DBOOST_SP_USE_STD_ATOMIC -DBOOST_AC_USE_STD_ATOMIC -pthread -I/usr/include -I./leveldb/include -I./leveldb/helpers/memenv   -I./secp256k1/include -I./univalue/include -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS -Ilibs/include -Ilibs/include/util -Ilibs/include/params -Ilibs/include/gmp -Ilibs/include/contracts -Ilibs/include/blockchain/store -Ilibs/include/blockchain/changes -Ilibs/include/blockchain -Ilibs/include/bitcoin -Ilibs/include/auditor/store -Ilibs/include/auditor  -Wstack-protector -fstack-protector-all -Wall -Wextra -Wformat -Wvla -Wno-unused-parameter -Wno-implicit-fallthrough    -fPIE -g -O2 -MT bgoldd-bitcoind.o -MD -MP -MF .deps/bgoldd-bitcoind.Tpo -c -o bgoldd-bitcoind.o `test -f 'bitcoind.cpp' || echo './'`bitcoind.cpp

pinachet ★★★★★
() автор топика
Ответ на: Так работает? от d_a

Не ругается, но ты предлагаешь весь код либы переписать на свое ? Плиз поподробнее что ты думаешь

#ifndef BITCOIN_CRYPTO_COMMON_H
#define BITCOIN_CRYPTO_COMMON_H

#if defined(HAVE_CONFIG_H)
#include <config/bitcoin-config.h>
#endif

#include <assert.h>
#include <stdint.h>
#include <string.h>

#include <compat/endian.h>

uint16_t static inline ReadLE16(const unsigned char* ptr)
{
    uint16_t x;
    memcpy((char*)&x, ptr, 2);
    return le16toh(x);
}

uint32_t static inline ReadLE32(const unsigned char* ptr)
{
    uint32_t x;
    memcpy((char*)&x, ptr, 4);
    return le32toh(x);
}

uint64_t static inline ReadLE64(const unsigned char* ptr)
{
    uint64_t x;
    memcpy((char*)&x, ptr, 8);
    return le64toh(x);
}

void static inline WriteLE16(unsigned char* ptr, uint16_t x)
{
    uint16_t v = htole16(x);
    memcpy(ptr, (char*)&v, 2);
}

void static inline WriteLE32(unsigned char* ptr, uint32_t x)
{
    uint32_t v = htole32(x);
    memcpy(ptr, (char*)&v, 4);
}

void static inline WriteLE64(unsigned char* ptr, uint64_t x)
{
    uint64_t v = htole64(x);
    memcpy(ptr, (char*)&v, 8);
}

uint32_t static inline ReadBE32(const unsigned char* ptr)
{
    uint32_t x;
    memcpy((char*)&x, ptr, 4);
    return be32toh(x);
}

uint64_t static inline ReadBE64(const unsigned char* ptr)
{
    uint64_t x;
    memcpy((char*)&x, ptr, 8);
    return be64toh(x);
}

void static inline WriteBE32(unsigned char* ptr, uint32_t x)
{
    uint32_t v = htobe32(x);
    memcpy(ptr, (char*)&v, 4);
}

void static inline WriteBE64(unsigned char* ptr, uint64_t x)
{
    uint64_t v = htobe64(x);
    memcpy(ptr, (char*)&v, 8);
}

/** Return the smallest number n such that (x >> n) == 0 (or 64 if the highest bit in x is set. */
uint64_t static inline CountBits(uint64_t x)
{
#if HAVE_DECL___BUILTIN_CLZL
    if (sizeof(unsigned long) >= sizeof(uint64_t)) {
        return x ? 8 * sizeof(unsigned long) - __builtin_clzl(x) : 0;
    }
#endif
#if HAVE_DECL___BUILTIN_CLZLL
    if (sizeof(unsigned long long) >= sizeof(uint64_t)) {
        return x ? 8 * sizeof(unsigned long long) - __builtin_clzll(x) : 0;
    }
#endif
    int ret = 0;
    while (x) {
        x >>= 1;
        ++ret;
    }
    return ret;
}

#endif // BITCOIN_CRYPTO_COMMON_H
pinachet ★★★★★
() автор топика
Ответ на: комментарий от SZT

#define _BSD_SOURCE в файле ./crypto/common.h не помог (

pinachet ★★★★★
() автор топика
Ответ на: комментарий от pinachet

Десять функций можно и переписать, если другого выхода нет. Они все по одному принципу работают - игнорируем порядок байтов хоста, но читаем или пишем в порядке байтов таргета. Канонический источник: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html

d_a ★★★★★
()
Последнее исправление: d_a (всего исправлений: 1)
Ответ на: комментарий от vtVitus

у меня поновее но не суть

gcc --version

gcc (GCC) 9.1.1 20190503 (Red Hat 9.1.1-1)

pinachet ★★★★★
() автор топика
Ответ на: комментарий от d_a

Там траблы обнаружил только ,что в том что библиотека получается два раза подключается common.h родная проекта и нашего дополнения , но без -Iнашего_h не компилиться наши компоненты .

Как решить лучше всего?

pinachet ★★★★★
() автор топика
Ответ на: комментарий от vtVitus

Так решилось проблема удалением из -Iпапки в которой есть теже описания что и в основной репе .

Сейчас проблема в том что я с линковать не могу свой header . Сейчас буду отдельную тему делать

pinachet ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.