Linux-ohjelman kääntäminen Mingw64:llä

Viestiketju alueella 'Ohjelmointi' , aloittaja Tataz, 23.10.2017.

  1. Tataz

    Rekisteröitynyt:
    04.03.2013
    Viestejä:
    1 168
    Hei

    Olen jo reilut 10 tuntia yrittänyt kääntää ohjelmaa https://github.com/Optiminer/hodlminer-wolf Windowsille.

    Osaisiko joku osaavampi käyttäjä tehdä ohjeet kuinka saan ympäristön ja asetukset kääntämiselle kuntoon? Tarkoitus on saada yksittäinen 64-bittinen exe-tiedosto.
     
  2. Humanoid

    Rekisteröitynyt:
    30.10.2006
    Viestejä:
    149
    Olisiko seuraavasta apua:
    1. Asenna MSYS2 lataamalla 64-bittinen latauspaketti osoitteesta http://www.msys2.org/
    2. Käynnistä MSYS-shelli 64-bittisenä ja päivitä siellä systeemi seuraavalla komennolla: pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
    3. Sulje shelli ja käynnistä se uudestaan jonka jälkeen päivitä kaikki paketit komennolla: pacman -Syu
    4. Toista vaihe 3 uudestaan mikäli MSYS sitä pyytää
    5. Asenna kääntäjä komennolla:
      pacman -S git make automake autoconf mingw-w64-$(uname -m)-gcc mingw-w64-$(uname -m)-binutils
    6. Lataa hodlminerin koodit: git clone https://github.com/Optiminer/hodlminer-wolf.git
    7. Asenna hodlminerin vaatimat libcurl-dev ja pthreads: pacman -S libcurl-devel mingw-w64-$(uname -m)-winpthreds-git
    8. Noudata hodlminerin loppuja ohjeita (autogen, configure ja make)
    Tämä ei tietty takaa vielä sitä, että kääntyykö koodi.
     
  3. Tataz

    Rekisteröitynyt:
    04.03.2013
    Viestejä:
    1 168
    Käynnistämällä mingw64.exe:n pääsin siihen asti kunnes ./configure:a ajoin

    checking for curl-config... /mingw64/bin/curl-config
    checking for the version of libcurl... 7.55.1
    checking for libcurl >= version 7.15.2... yes
    checking whether libcurl is usable... no
    configure: error: Missing required libcurl >= 7.15.2

     
    Viimeksi muokattu: 19.11.2017
  4. telcoM

    Rekisteröitynyt:
    27.08.2015
    Viestejä:
    635
    Koodi:
    checking whether libcurl is usable... no
    
    Tarkoittaa että configure-skripti yritti kääntää pienen testiohjelman jossa se yritti käyttää libcurl-kirjastoa, mutta jokin meni vikaan.

    Kun ajat ./configure -komentoa, siihen samaan hakemistoon pitäisi syntyä tekstitiedosto "config.log". Etsi sieltä tuo "checking whether libcurl is usable" tai yleensä mainintoja libcurlista, ja katso tuleeko sen jälkeen jotakin virheilmoituksen näköistä.
     
  5. Tataz

    Rekisteröitynyt:
    04.03.2013
    Viestejä:
    1 168
    Kiitos. Tuolta näkyykin virhe "curl/curl.h: No such file or directory" .

    Curlin headerit löytyvät hakemistosta C:\msys64\usr\include\curl, mutta tämä hakemisto on ilmeisesti vain msys2.exe:n puolella, jossa taas mingw64:n gcc:tä ei löydy, vaikka asennettu. "checking for gcc... no".

    Mingw64.exe:n puolella hakemistossa C:\msys64\mingw64\include curleja ole.

    Asensin gcc:n "pacman -S gcc". Asentui vanha versio 6.4, kun mingw64:llä oli 7.2.

    Nyt tuli sitten virhe:
    configure:5905: gcc -o conftest.exe -g -O2 conftest.c -lcurl -lnghttp2 -lidn2 -liconv -lunistring -lssh2 -lssh2 -lssl -lz -lcrypto -lz -lpsl -lssl -lcrypto -lssl -lz -lcrypto -lz -lgdi32 -L/usr/lib -lgssapi -lheimntlm -lkrb5 -lhx509 -lcom_err -L/usr/lib -lcrypto -lasn1 -lwind -lheimbase -lroken -L/usr/lib -lsqlite3 -lcrypt -lz >&5
    /usr/lib/gcc/x86_64-pc-msys/6.4.0/../../../../x86_64-pc-msys/bin/ld: cannot find -liconv
    /usr/lib/gcc/x86_64-pc-msys/6.4.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lunistring
    collect2: error: ld returned 1 exit status

    Asennus: pacman -S libiconv-devel
    korjaa iconv-ongelman ja pacman -S libunistring-devel unistring-ongelman.

    Make antaa nyt virheen.
    sha512_avx2.c:21:90: virhe: ”ulong” esittelemättä (ensimmäinen käyttökerta tässä funktiossa)
    #define ROR64(a, n) _mm256_or_si256(_mm256_srli_epi64(a, n), _mm256_slli_epi64(a, sizeof(ulong)*8 - n))


    Msys2.exe vai Mingw64.exe? Kumpi on nyt se oikea vaihtoehto?

    Edit:
    Mingw64:n puoella pacman -S mingw-w64-x86_64-curl korjasi curl-ongelmat.

    Määritin käsin ulongin. Lisäsin rivin add '#define ulong unsigned long tiedostoon sha512_avx2.c. Nyt tuli vielä virhe htobe64:sta
    hodlminer-sha512_avx2.o:sha512_avx2.c:(.text+0x3ed3): undefined reference to `htobe64'
    hodlminer-sha512_avx2.o:sha512_avx2.c:(.text+0x3f01): undefined reference to `htobe64'

    Edit 2:
    Msys2.exe:n puolella hodlminer.exe tuli käänntyksi, kun lisäsin
    #include <endian.h>
    Tosin käännös on riippuvainen kaiken maailman dll-tiedostoista. Katsotaan voikohan endian-tiedostot kopioida Mingw64:n puolelle suoraan.

    Edit 2.1:
    Endian ongelman sai korjattua Mingw64:n puolella määrityksillä.
    Edit 2.2:
    Kyseisellä määrityksellä laskenta ei toimi oikein. Eli määritykset eivät olleetkaan Mingw64:lle sopivat.

    #if __BYTE_ORDER == __LITTLE_ENDIAN

    #define htobe16(x) __bswap_16(x)
    #define htobe32(x) __bswap_32(x)
    #define htobe64(x) __bswap_64(x)

    #define be16toh(x) __bswap_16(x)
    #define be32toh(x) __bswap_32(x)
    #define be64toh(x) __bswap_64(x)

    #define htole16(x) (x)
    #define htole32(x) (x)
    #define htole64(x) (x)

    #define le16toh(x) (x)
    #define le32toh(x) (x)
    #define le64toh(x) (x)

    #endif /*__BYTE_ORDER == __LITTLE_ENDIAN*/

    #if __BYTE_ORDER == __BIG_ENDIAN

    #define htobe16(x) (x)
    #define htobe32(x) (x)
    #define htobe64(x) (x)

    #define be16toh(x) (x)
    #define be32toh(x) (x)
    #define be64toh(x) (x)

    #define htole16(x) __bswap_16(x)
    #define htole32(x) __bswap_32(x)
    #define htole64(x) __bswap_64(x)

    #define le16toh(x) __bswap_16(x)
    #define le32toh(x) __bswap_32(x)
    #define le64toh(x) __bswap_64(x)

    #endif /*__BYTE_ORDER == __BIG_ENDIAN*/


    Edit 3:
    Jos Msys2:n puolella määritään configuressa -static niin config.log antaa pitkän rimpsun ongelmia.

    configure:5871: checking whether libcurl is usable
    configure:5905: gcc -o conftest.exe -O3 -static conftest.c -lcurl -lnghttp2 -lidn2 -liconv -lunistring -lssh2 -lssh2 -lssl -lz -lcrypto -lz -lpsl -lssl -lcrypto -lssl -lz -lcrypto -lz -lgdi32 -L/usr/lib -lgssapi -lheimntlm -lkrb5 -lhx509 -lcom_err -L/usr/lib -lcrypto -lasn1 -lwind -lheimbase -lroken -L/usr/lib -lsqlite3 -lcrypt -lz >&5
    /usr/lib/libunistring.a(striconveh.o):(.text+0xb8): undefined reference to `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0xb8): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x3b7): undefined reference to `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x3b7): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x57d): undefined reference to `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x57d): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x6c2): undefined reference to `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x6c2): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x6eb): undefined reference to `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x6eb): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x87e): more undefined references to `libiconv' follow
    /usr/lib/libunistring.a(striconveh.o):(.text+0x87e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x969): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0xab0): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0xc00): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x1084): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x10e6): additional relocation overflows omitted from the output
    /usr/lib/libunistring.a(striconveh.o):(.text+0x1514): undefined reference to `libiconv_open'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x155f): undefined reference to `libiconv_open'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x15f5): undefined reference to `libiconv_open'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x1613): undefined reference to `libiconv_close'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x1621): undefined reference to `libiconv_close'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x1644): undefined reference to `libiconv_close'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x1664): undefined reference to `libiconv_close'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x1677): undefined reference to `libiconv_close'
    /usr/lib/libunistring.a(striconveh.o):(.text+0x168b): more undefined references to `libiconv_close' follow
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x122): undefined reference to `u_strFromUTF8_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x18a): undefined reference to `u_strFromUTF8_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x1e0): undefined reference to `uidna_nameToASCII_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x218): undefined reference to `u_strToUTF8_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x26a): undefined reference to `u_strToUTF8_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x2cb): undefined reference to `uidna_nameToASCII_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x403): undefined reference to `uidna_openUTS46_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x438): undefined reference to `uidna_close_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0xb24): undefined reference to `uidna_openUTS46_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0xc8e): undefined reference to `uidna_close_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x14ea): undefined reference to `ucnv_open_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x15a1): undefined reference to `ucnv_toUChars_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x15ac): undefined reference to `ucnv_close_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x15dd): undefined reference to `u_strToLower_59'
    /usr/lib/libpsl.a(libpsl_la-psl.o):(.text+0x1617): undefined reference to `u_strToUTF8_59'
    collect2: error: ld returned 1 exit status
     
    Viimeksi muokattu: 21.11.2017
  6. Tataz

    Rekisteröitynyt:
    04.03.2013
    Viestejä:
    1 168
    Kunka __bswap_64(x) saisi totetettua tehokkaimmin? Alla oleva koodi toimii, mutta se näköjään paloittelee 64 bittisen sanan kahteen 32 bittiseen osaan.

    Koodi:
    #define __bswap_constant_64(x) \
      ((((x) & 0xff00000000000000ull) >> 56)          \
      | (((x) & 0x00ff000000000000ull) >> 40)          \
      | (((x) & 0x0000ff0000000000ull) >> 24)          \
      | (((x) & 0x000000ff00000000ull) >> 8)          \
      | (((x) & 0x00000000ff000000ull) << 8)          \
      | (((x) & 0x0000000000ff0000ull) << 24)          \
      | (((x) & 0x000000000000ff00ull) << 40)          \
      | (((x) & 0x00000000000000ffull) << 56))
    
    #define __bswap_64(x) \
      (__extension__                \
      ({ union { __extension__ unsigned long long int __ll;      \
          unsigned int __l[2]; } __w, __r;        \
      if (__builtin_constant_p (x))            \
        __r.__ll = __bswap_constant_64 (x);          \
        else                  \
        {                  \
        __w.__ll = (x);              \
        __r.__l[0] = __bswap_32 (__w.__l[1]);        \
        __r.__l[1] = __bswap_32 (__w.__l[0]);        \
        }                  \
        __r.__ll; }))
    
    Tämä taitaa olla vielä parempi ratkaisu.

    Koodi:
    #define htobe64(x) (((uint64_t)(x) << 56) | \
      (((uint64_t)(x) << 40) & 0xff000000000000ULL) | \
      (((uint64_t)(x) << 24) & 0xff0000000000ULL) | \
      (((uint64_t)(x) << 8)  & 0xff00000000ULL) | \
      (((uint64_t)(x) >> 8)  & 0xff000000ULL) | \
      (((uint64_t)(x) >> 24) & 0xff0000ULL) | \
      (((uint64_t)(x) >> 40) & 0xff00ULL) | \
      ((uint64_t)(x)  >> 56))
    

    Edit:
    Paisi, että enää ei toimikaan. Mielestäni oli jo kerran toimiva versio, mutta taas laskenta menee väärin.

    Edit 2:
    Eihän tuota htobe64:sta tarvita oikeastaan mihinkään ja ilmeisesti sen laskenta menee oikein, mutta miksi sitten mingw64:llä ohjelma ei käänny toimivana. Msys2:n puolella syntyy toimiva binaari, mutta esilaisia dll-kirjastoja tarvitaan noin 40 Mt.

    En ole tosin pystynyt varmistamaan meneekö lasketa väärin vai raportoiko hodlminer muusta syystä virheellisiä arvoja palvelimelle, joka sitten hylkää tulokset. Msys2:n puolella tehty binääri kuitenkin toimii täysin oikein, mutta on hitaampi ja vaatii tolkuttomasti enemmän dll-tiedostoja.

    Täytyy kokeilla alusta uudelleen, jos joku moka käynyt jossain välissä. En tällä kertaa asentele mitään Msys2:n puolella.
     
    Viimeksi muokattu: 22.11.2017
  7. Tataz

    Rekisteröitynyt:
    04.03.2013
    Viestejä:
    1 168
    Kääsin tämä ohjeen mukaan curlin manuaalisesti https://gist.github.com/erkmos/406a5e4bededd38fd797 . Sama ongelma. Kaikki pooli hylkää kaikki tulokset.

    Käänsin pthreadsin noilla ohjeilla, mutta jotain menee pieleen, kääntäessä tulee virhettä:
    hodlminer-util.o:util.c:(.text+0x4ba): undefined reference to `__imp_pthread_mutex_lock'
    hodlminer-util.o:util.c:(.text+0x4da): undefined reference to `__imp_pthread_mutex_unlock'
    hodlminer-util.o:util.c:(.text+0xbef): undefined reference to `__imp_pthread_mutex_lock'
    hodlminer-util.o:util.c:(.text+0xc16): undefined reference to `__imp_pthread_cond_signal'
    hodlminer-util.o:util.c:(.text+0xc1f): undefined reference to `__imp_pthread_mutex_unlock'
    hodlminer-util.o:util.c:(.text+0xd3e): undefined reference to `__imp_pthread_mutex_lock'
    hodlminer-util.o:util.c:(.text+0xd65): undefined reference to `__imp_pthread_cond_signal'

    Edit:
    Yllämainittu ongelma korjaantuu, kun lisää CFLAGS:iin -DPTW32_STATIC_LIB.

    Koodi:
    #!/bin/bash
    DEPS="/home/user/win64_deps"
    echo ${DEPS}
    ./configure --host=x86_64-w64-mingw32 \
    CFLAGS="-DWIN32 -DCURL_STATICLIB -DPTW32_STATIC_LIB -O3 -std=c99 -I${DEPS}/include" \
    --with-libcurl=${DEPS} LDFLAGS="-static -L${DEPS}/lib"
    
    Edelleenkään pooli ei hyväksi tuloksia. Ongelmaa täytyy etsiä vielä muualta.
     
    Viimeksi muokattu: 22.11.2017
  8. mystikkogames

    Rekisteröitynyt:
    12.03.2017
    Viestejä:
    150
    __bswap_constant_64(x)
    siirtää 64 bittisen luvun 32 bittiä alas ja alemmat 32 ylös. En tiedä mikä logiikka siinä on.

    hodlminer-util.o:util.c:(.text+0x4ba): undefined reference to `__imp_pthread_mutex_lock'

    undefined reference errorit tulee kun gcc ei löydä funktiota. Voi olla että tuo on liian riippuvainen Linuxista.

    Sen korjaaminen on:

    [​IMG]
     
  9. Tataz

    Rekisteröitynyt:
    04.03.2013
    Viestejä:
    1 168
    Tuo hodlminer on forkkaus cpu-mineristä, jonka kyllä saa siististi käännettyä. Forkkauksessa on ilmeisesti koodista tullut liian Linux-riippuvaista ja käännös suoraan ei onnistu. Löysin maininnan, että Msysin puolella ei saa luotua staattista buildia. Voisi kokeilla ristiinkäännöstä Linuxin puolella, mutta veikkaampa, ettei silloinkaan synny toimivaa binaariä. Millähän joku on aikoinaan kääntänyt tuon Windowsille.

    Joo elikkä bswap_constant_64:n jälkeen loppu endianmuunnoksesta voidaan tehdä kahdessa 32 bitin osassa.
    0123|4567
    4567|0123 - bswap_constant_64
    7654|3210 - __bswap_32
     
  10. Desgorr

    Rekisteröitynyt:
    11.10.2010
    Viestejä:
    2 480
    Jos sattuu olemaan kymppi alla, niin olisiko mahdollista käyttää kympistä löytyvää Windows Subsystem for Linuxia tuon kääntämiseen ja ajamiseen? Kerta Windowsin alla tuota on tarkoitus ajella. Subsystemin voi asentaa Windows Featureista ja itse distron saa Microsoft Storesta ilmaiseksi, kunhan käytössä on uusin versio kympistä. Muuten asentuu tuon subsystemin mukana.
     
    Viimeksi muokattu: 24.11.2017
  11. Tataz

    Rekisteröitynyt:
    04.03.2013
    Viestejä:
    1 168
    Huomasin, että Mingw:llä tulee tällainen varoitus.

    Koodi:
    #define ulong unsigned long
    Koodi:
    sha512_avx2.c:33:83: warning: overflow in implicit constant conversion [-Woverflow]
    #define ROR64(a, n) _mm256_or_si256(_mm256_srli_epi64(a, n), _mm256_slli_epi64(a, sizeof(ulong)*8 - n))
    
    ulong on Cygwinissa 8 tavua ja Mingw64:n puolella 4.

    Täytyy kokeilla
    Koodi:
    #define long long long
    ennen muita määrityksia.
     
    Viimeksi muokattu: 28.12.2017
Tagit:

Jaa tämä sivu

Alibi
Anna
Deko
Dome
Erä
Hymy
Kaksplus
Kippari
Kotilääkäri
Kotiliesi
Koululainen
Ruoka.fi
Parnasso
Seura
Suomen Kuvalehti
TM Rakennusmaailma
Tekniikan Maailma
Vauhdin Maailma
Golfpiste
Vene
Nettiauto
Ampparit
Plaza
Muropaketti