Ошибка Makefile: boost / asio.hpp: нет такого файла или каталога (Windows)

#c #linux #boost #makefile

#c #linux #boost #makefile

Вопрос:

У меня есть программа на C , которая отлично компилируется в Linux. Но когда я попытался скомпилировать его в Windows, я получил : fatal error: boost/asio.hpp: No such file or directory .
Я не понимаю, как это возможно, поскольку у меня есть еще несколько включений boost ( <boost/thread.hpp> и <boost/locale.hpp> ), и они работают нормально. Я также проверил в своей библиотеке boost, и thread.hpp , locale.hpp и asio.hpp все там.
Если это имеет значение, в Linux я установил boost со следующими командами (и он там работает):

 sudo apt-get install libboost-all-dev
sudo apt-get install aptitude
aptitude search boost                                         
  

И это мой код:

Client.cpp:

 #include "../include/ConnectionHandler.h"
#include <stdlib.h>
#include <boost/thread.hpp>
#include <boost/locale.hpp>

 //A method used to read messages from the console (stdin) and send them to the server using a ConnectionHandler 
void sendMessage(ConnectionHandler *connectionHandler){ // handles stdin
    if (connectionHandler->isConnected()){
        while (1){
            const short bufsize = 1024;
            char buf[bufsize];
            std::cin.getline(buf, bufsize);
            std::string line(buf);
            if (!connectionHandler->sendLine(line)) { break; }
            if (line=="QUIT"){
                boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
                if (!connectionHandler->isConnected()) { break; }
            }
        }
    }
}

//A method used to read messages from the socket (using the ConnectionHandler)
void recieveMessage(ConnectionHandler *connectionHandler){ // handles socket
    while (1){
        std::string answer;
        if (!connectionHandler->getLine(answer)) {
            std::cout << "Disconnected.nExiting...n" << std::endl;
            break;
        }
        int len=answer.length();
        answer.resize(len-1);
        std::cout << answer << std::endl << std::endl; // double line drops so it will be easier to notice between messages
        if (answer == "SYSMSG QUIT ACCEPTED") {
            std::cout << "Disconnected.nExiting...n" << std::endl;
            break;
        }
    }
    (*connectionHandler).close();
}

int main (int argc, char *argv[]) {
    if (argc < 3) {
        std::cerr << "Usage: " << argv[0] << " host port" << std::endl << std::endl;
        return -1;
    }
    std::string host = argv[1];
    unsigned short port_ = atoi(argv[2]);
    ConnectionHandler *connectionHandler_= new ConnectionHandler(host,port_);
    if (!(connectionHandler_)->connect()) {
        std::cerr << "Cannot connect to " << host << ":" << port_ << std::endl;
        delete connectionHandler_;
        return 1;
    }
    boost::thread sender(amp;sendMessage,connectionHandler_); // a different thread to handle stdin
    boost::thread reciever(amp;recieveMessage,connectionHandler_); // a different thread to handle the socket
    reciever.join();
    sender.join();
    delete connectionHandler_;
}
  

ConnectionHandler.h:

 #ifndef CONNECTION_HANDLER__
#define CONNECTION_HANDLER__

#include <string>
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;

class ConnectionHandler {
private:
    const std::string host_;
    const short port_;
    boost::asio::io_service io_service_;   // Provides core I/O functionality
    tcp::socket socket_;
    bool isConnected_;

public:
    ConnectionHandler(std::string host, short port);
    virtual ~ConnectionHandler();

    bool connect();
    bool getBytes(char bytes[], unsigned int bytesToRead);
    bool sendBytes(const char bytes[], int bytesToWrite);
    bool getLine(std::stringamp; line);
    bool sendLine(std::stringamp; line);
    bool getFrameAscii(std::stringamp; frame, char delimiter);
    bool sendFrameAscii(const std::stringamp; frame, char delimiter);
    void close();
    bool isConnected();
}; 

#endif
  

ConnectionHandler.cpp:

 #include "../include/ConnectionHandler.h"

using boost::asio::ip::tcp;
using std::cin;
using std::cout;
using std::cerr;
using std::endl;
using std::string;

ConnectionHandler::ConnectionHandler(string host, short port): host_(host), port_(port), io_service_(), socket_(io_service_), isConnected_(false){}

ConnectionHandler::~ConnectionHandler() { close(); }

bool ConnectionHandler::connect() {
    std::cout << "Starting connect to " << host_ << ":" << port_ << std::endl;
    try {
        tcp::endpoint endpoint(boost::asio::ip::address::from_string(host_), port_); // the server endpoint
        boost::system::error_code error;
        socket_.connect(endpoint, error);
        if (error) { throw boost::system::system_error(error); }
        else{
            std::cout << "Connection to " << host_ << ":" << port_ << " Successfully made!" << std::endl;
            isConnected_ = true;
        }
    }
    catch (std::exceptionamp; e) {
        std::cerr << "Connection failed (Error: " << e.what() << ')' << std::endl;
        return false;
    }
    return true;
}

bool ConnectionHandler::getBytes(char bytes[], unsigned int bytesToRead) {
    size_t tmp = 0;
    boost::system::error_code error;
    try {
        while (!error amp;amp; bytesToRead > tmp ) {
            tmp  = socket_.read_some(boost::asio::buffer(bytes tmp, bytesToRead-tmp), error);
        }
        if(error) { throw boost::system::system_error(error); }
    } 
    catch (std::exceptionamp; e) {
        std::cerr << "recv failed (Error: " << e.what() << ')' << std::endl;
        return false;
    }
    return true;
}

bool ConnectionHandler::sendBytes(const char bytes[], int bytesToWrite) {
    int tmp = 0;
    boost::system::error_code error;
    try {
        while (!error amp;amp; bytesToWrite > tmp ) {
            tmp  = socket_.write_some(boost::asio::buffer(bytes   tmp, bytesToWrite - tmp), error);
        }
        if(error) { throw boost::system::system_error(error); }
    } 
    catch (std::exceptionamp; e) {
        std::cerr << "recv failed (Error: " << e.what() << ')' << std::endl;
        return false;
    }
    return true;
}

bool ConnectionHandler::getLine(std::stringamp; line) { return getFrameAscii(line, 'n'); }

bool ConnectionHandler::sendLine(std::stringamp; line) { return sendFrameAscii(line, 'n'); }

bool ConnectionHandler::getFrameAscii(std::stringamp; frame, char delimiter) {
    char ch;
    do{
        if(!getBytes(amp;ch, 1)) { return false; }
        frame.append(1, ch);
    }while (delimiter != ch);
    return true;
}

bool ConnectionHandler::sendFrameAscii(const std::stringamp; frame, char delimiter) {
    bool result=sendBytes(frame.c_str(),frame.length());
    if(!result) return false;
    return sendBytes(amp;delimiter,1);
}

// Close down the connection properly.
void ConnectionHandler::close() {
    try{
        socket_.close();
        isConnected_ = false;
    } 
    catch (...) { std::cout << "closing failed: connection already closed" << std::endl; }
}

bool ConnectionHandler::isConnected(){ return isConnected_; }                   
  

makefile:

 # All Targets
all: client

# Tool invocations
# Executable "client" depends on the files Client.o, ConnectionHandler.o.
client: bin/Client.o bin/ConnectionHandler.o
    @echo 'Building target: client'
    @echo 'Invoking: C   Linker'
    g   -o bin/client bin/Client.o bin/ConnectionHandler.o -lboost_system -lboost_locale -lboost_thread
    @echo 'Finished building target: client'
    @echo ' '

# Depends on the source and header files
bin/Client.o: src/Client.cpp
    g   -g -Wall -c -Linclude -I/usr/local/boost/1.57.0/include/boost -o bin/Client.o src/Client.cpp

# Depends on the source and header files 
bin/ConnectionHandler.o: src/ConnectionHandler.cpp
    g   -g -Wall -Weffc   -c -Linclude -o bin/ConnectionHandler.o src/ConnectionHandler.cpp


.PHONY: clean
#Clean the build directory
clean: 
    rm -f bin/*                    
  

Как я могу решить эту ошибку?

Комментарии:

1. /usr/local/boost/1.57.0/include/boost , который не похож на путь Windows. Вы используете cygwin??

2. Вы используете g в Windows или компилятор Microsoft?

3. Посмотрите на команду компилятора, которая выполняет печать, которая выдает ошибку. Вырежьте и вставьте эту командную строку в приглашение командной строки. Происходит ли сбой таким же образом? Если это так, с вашим makefile все в порядке.

4. dreschrjm, вы правы. Кажется, у меня проблема с моим Windows path. Я также перепроверил программу и увидел, что у меня проблемы с включением thread.hpp и locale.hpp. Все эти файлы находятся по этому пути: C:Boostincludeboost-1_59boost . Как я могу включить его правильно (пытался поиграть с ним, не удалось)?