Как использовать сторонние библиотеки 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;
}
}