C++ Crow vs. Rust Axum: Raw HTTP Parsing Performance and Peak Resource Consumption
Benchmarking Methodology: HTTP Request Parsing
To rigorously compare the raw HTTP request parsing performance and peak resource consumption of C++ Crow and Rust Axum, a standardized benchmarking suite was developed. The objective is to isolate the overhead introduced by the web frameworks themselves, minimizing external dependencies and network latency. We’ll focus on parsing incoming HTTP requests, specifically the headers and body, under high concurrency. This scenario is representative of API gateways, reverse proxies, and high-throughput microservices where efficient request handling is paramount.
The benchmark simulates a constant stream of POST requests with a moderately sized JSON payload (approximately 1KB). The server’s task is to receive the request, parse its headers, extract the body, and perform a minimal validation (e.g., checking for a specific key in the JSON). No complex business logic or database interaction is involved to ensure we are measuring the framework’s intrinsic parsing and request handling capabilities.
C++ Crow Implementation
The C++ Crow framework, known for its minimalist design and performance, was chosen for its direct approach to HTTP handling. The implementation focuses on leveraging Crow’s built-in request parsing capabilities. We’ll use a simple POST endpoint that accepts JSON and returns a 200 OK response after basic validation.
Crow Server Code
The following C++ code demonstrates a basic Crow application. It sets up a single endpoint that expects a JSON payload. The `request.body` is accessed directly, and `Crow::json::load` is used for parsing. Error handling for invalid JSON is included.
#include <crow.h>
#include <iostream>
#include <string>
#include <vector>
int main()
{
crow::SimpleApp app;
// Define the endpoint for POST requests
CROW_ROUTE(app, "/parse_json")
.methods(crow::HTTPMethod::POST)
([](const crow::request& req) {
std::string body_str = req.body;
crow::json::rvalue json_body;
try {
json_body = crow::json::load(body_str);
} catch (const std::exception& e) {
return crow::response(400, "Invalid JSON: " + std::string(e.what()));
}
// Minimal validation: check for a specific key
if (!json_body.has("message")) {
return crow::response(400, "Missing 'message' key in JSON");
}
// Return a success response
return crow::response(200, "JSON parsed successfully");
});
// Set the logging level to suppress verbose output during benchmark
app.loglevel(crow::LogLevel::CRITICAL);
// Run the application on port 8080
app.port(8080).multithreaded().run();
return 0;
}
Compilation and Execution
To compile this code, you’ll need the Crow library and a C++17 compliant compiler. A typical compilation command using g++ would be:
g++ -std=c++17 -pthread -o crow_server crow_server.cpp -lboost_system -lboost_thread -lboost_filesystem -lboost_regex -lboost_date_time -lboost_atomic -lboost_chrono -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine -lboost_fiber -lboost_locale -lboost_program_options -lboost_random -lboost_serialization -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization -lboost_context -lboost_coroutine