Ok, dieses Problem nervt mich seit einem Jahrwährend. Ich erstelle ein C ++ - Programm mit den Bibliotheken libpcap und libnet. Es scannt ein bestimmtes Land nach offenen Ports, indem es mit libnet synchronisiert und mit libpcap auf Antworten überprüft. Ich habe ein main.cpp Datei, die enthält network.h die die Quelldateien enthält, die zum Generieren der IPv4-Bereiche erforderlich sind (regex.cpp) und zum Scannen (libnet.cpp). Jetzt mein network.h Datei enthält die Definition für struct range Das sind nur zwei uint32_t"s repräsentiert die Anfangsadresse des Bereichs und das Ende.
network.h:
#ifndef NETWORK_H
#define NETWORK_H
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <regex>
#include <fstream>
#include <libnet.h>
#include <pcap.h>
#include "src/regex.cpp"
#include "src/libnet.cpp"
#include "src/libpcap.cpp"
#define COLOR_GREEN "x1b[32m"
#define COLOR_RED "x1b[31m"
#define COLOR_RESET "x1b[0m"
#define SNAP_LEN 1518
typedef struct range {
uint32_t begin;
uint32_t end;
} range;
#endif
Und ich benutze es struct range als Rückgabetyp für getRangeByCountry
#include "../network.h"
std::vector<struct range> getRangeByCountry(const char* country){
std::vector<struct range> ranges;
try {
std::ifstream f("csv/geoip.csv");
std::regex re(""\d+.\d+.\d+.\d+","\d+.\d+.\d+.\d+","(\d+)","(\d+)","\w$
while (1){
std::string line;
std::getline(f, line);
std::smatch m;
if(line == ""){break;}
std::regex_match(line, m, re);
if (m[3] == country){
struct range r;
r.begin = std::stoul(std::string(m[1]), NULL, 0);
r.end = std::stoul(std::string(m[2]), NULL, 0);
ranges.push_back(r);
}
}
} catch (...){return ranges;}
return std::move(ranges);
}
Aber wenn ich kompiliere bekomme ich diesen Fehler:
src/regex.cpp: In function ‘std::vector<range> getRangeByCountry(const
char*)’:
src/regex.cpp:15:17: error: aggregate ‘range r’ has incomplete type and
cannot be defined
struct range r;
Warum gibt der Compiler keinen Fehler aus, wenn ich einen Vektor von deklariere? struct range örtlich? Oder wenn ich den gleichen Rückgabetyp einstelle? Wenn ich die Struktur in derselben Datei definiere wie getRangebyCountry () es wird fehlerfrei kompiliert. Ist das ein Problem mit meinem g ++ Parameter? Hier sind sie nur für den Fall: g++ main.cpp -lpcap -lnet --std=c++11
Antworten:
0 für die Antwort № 1Problem behoben. @Walter und @IgorTandetnik hatten recht. Im Netzwerk Ich habe eine Definition für getRangeByCountry () und entfernte die .cpp beinhaltet wie folgt:
#ifndef _NETWORK_H
#define _NETWORK_H
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <regex>
#include <fstream>
#include <libnet.h>
#include <pcap.h>
#define COLOR_GREEN "x1b[32m"
#define COLOR_RED "x1b[31m"
#define COLOR_RESET "x1b[0m"
#define SNAP_LEN 1518
std::vector<struct range> getRangeByCountry(const char*);
typedef struct range {
uint32_t begin;
uint32_t end;
} range;
Dann habe ich kompiliert regex.cpp getrennt und in meine Zusammenstellung von main.cpp so: g++ main.cpp src/regex.o
Aber ich bin immer noch sehr wackelig mit dem Konzept. Wenn ich andere cpp-Quelldateien einbeziehen möchte, muss ich sie separat kompilieren und dann ihre Definition in eine Header-Datei und ihre tatsächliche Definition in eine .o-Datei einfügen, wenn ich kompiliere main.cpp?