Как использовать сторонние библиотеки C++ в UNIX/Mac, используя POCO в качестве примера

Я довольно новичок в программировании и C++, и я пытаюсь использовать HTTP-сервисы POCO для доступа к торговой платформе, и после долгих проб и ошибок с использованием XCode это сработало, однако я не до конца понимаю, как это работает.

У меня есть несколько вопросов относительно использования сторонних библиотек, которые могут или не могут быть ориентированы на платформу, и они следующие:

1) Для чего нужны флаги компоновщика и как узнать, какие флаги компоновщика следует включить в сторонние библиотеки? Например, в XCode это флаги компоновщика, которые я включил, и они являются просто тем, что я скопировал из моей папки POCO /usr/local/Cellar/poco/1.7.9/lib на основе проб и ошибок.

2) Почему я не могу написать -lPocoNet и т. Д., И мне нужно написать полную ссылку: /usr/local/Cellar/poco/1.7.9/lib/libPocoNet.dylib вместо этого?

3) Хотя я понимаю, для чего нужны пути поиска в заголовке, для чего используются пути поиска в библиотеке?

4) Помимо ссылок на флаги, пути поиска в заголовках и пути поиска в библиотеках, на что следует обращать внимание при использовании сторонних библиотек? Я понимаю, что вопрос широкий, но я просто хотел бы иметь представление о том, с чего начать. Спасибо.

Вот пример кода, который я использую с github:

#include <iostream>
#include <iterator>
#include <string>
#include <sstream>

#include <Poco/Net/HTTPSClientSession.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/Net/SSLManager.h>
#include <Poco/StreamCopier.h>
#include <Poco/Path.h>
#include <Poco/URI.h>
#include <Poco/Exception.h>

using namespace Poco;
using namespace Poco::Net;
using namespace std;

// Edit these global variables with your own information

std::string account_id = "xxxxxxx";
std::string access_token = "xxxxxxxxxxxxxxxxxxxxxxxx";
std::string instruments = "EUR_USD,USD_CAD,EUR_JPY";
std::string domain = "https://stream-fxpractice.oanda.com";

/*****************************
 The domain variable should be:

 For Sandbox    -> https://stream-sandbox.oanda.com
 For fxPractice -> https://stream-fxpractice.oanda.com
 For fxTrade    -> https://stream-fxtrade.oanda.com
 ******************************/

void handleStream(streambuf* stream_buffer)
{
    std::istreambuf_iterator<char> eos; // end-of-range iterator
    std::istreambuf_iterator<char> iit (stream_buffer); // stream iterator 
    string str;

    while (iit!=eos) {
        ostringstream oss;
        while (*iit != '\n') {
            oss << *iit++;
        }

        //print the tick
        cout << oss.str() << endl;

        *iit++;
        }
    }

int main (){
    try {
        const Context::Ptr context = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");

        // prepare session
        URI uri(domain + std::string("/v3/accounts") + account_id +std::string("&instruments=") + instruments);

        HTTPSClientSession session(uri.getHost(), uri.getPort(), context);
        session.setKeepAlive(true);

        // prepare path
        string path(uri.getPathAndQuery());
        if (path.empty()) path = "/";

        // send request
        HTTPRequest req(HTTPRequest::HTTP_GET, path, 
        HTTPMessage::HTTP_1_1);
        req.set("Authorization", std::string("Bearer ") + access_token);
        session.sendRequest(req);

        // get response
        HTTPResponse res;
        istream& rs = session.receiveResponse(res);

        // handle response
        ostringstream out_string_stream;
        handleStream(rs.rdbuf());
        }
    catch (const Exception &e)
    {
        cerr << e.displayText() << endl;
    }
}

0 ответов

Другие вопросы по тегам