【Crow】一款开源C++Web框架的安装与构建

本文档详细记录了在Ubuntu 20.0.4环境下安装Crow C++ Web框架的过程,包括依赖库Boost、ASIO和CMake的配置。在遇到CMake找不到asio库的问题时,给出了修改CrowConfig.cmake的解决方案,并展示了如何启用CORS处理跨域问题。此外,还展示了一个简单的HelloWorld应用和一个处理JSON数据的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Crow的安装与构建

前言

项目地址:

https://github.com/crowcpp/crow

官方网站及文档说明:

https://crowcpp.org/master/

缘由:

前几天一直在寻找一款C++的Web框架,通过不断的在Github、StackOverFlow以及搜索引擎上搜索,最终我还是选择了Crow这一框架,其他相关框架还有,restbed,served,nrgest,微软的C++ REST SDK等,Github相关搜索C++ REST framework…

结果在测试用例构建时候,似乎遇到了一个bug,于是我提交了一个Issues,得到了开发人员的回复,最终问题得到了解决,在此,再次感谢项目维护人员的付出!


配置环境

本篇文章为Linux安装。其他平台或具体最低要求等,还请见官方说明文档

  • Ubuntu 20.0.4
  • GCC 9.4.0
  • Boost 1.71
  • ASIO 1.22.1
  • Cmake 3.24.0

到目前为止,Corw依赖使用的ASIO已经为脱离BOOST的独立版。

相关安装参考文章:

相关问题解决参考文章:

Unable to locate package ——Linux新手入门:Unable to locate package错误解决办法


安装Crow

从源码安装,详见官方说明文档

git clone https://github.com/CrowCpp/Crow.git

进入Crow目录,创建build目录,并进入。

mkdir build
cd build
cmake .. -DCROW_BUILD_EXAMPLES=OFF -DCROW_BUILD_TESTS=OFF
make install

Hello world

#include <crow.h>

int main(){
    crow::SimpleApp app;
    //测试
     CROW_ROUTE(app, "/test")([](){
        return "Hello world";
    });
    app.port(18888).multithreaded().run();
}

编译

  • g++
g++ main.cpp -o  main -lpthread
  • CMake
# 指定版本
cmake_minimum_required(VERSION 3.24)
# 项目名
project(main)
# 使用指定源文件来生成目标可执行文件
add_executable(main  main.cpp)
# 引入外部依赖包
find_package(Crow REQUIRED)
# 目标文件与库文件进行链接
target_link_libraries(main PUBLIC Crow::Crow)

测试

image-20220709084125646


我的第一个程序

  CROW_ROUTE(app, "/low_price_recommend").methods("POST"_method)([](const crow::request& req){
        auto x = crow::json::load(req.body);
        crow::json::wvalue return_ret({});//返回结果
        if (!x){//参数不全
            return_ret["status_code"] = std::string("0");
            return crow::response(return_ret);
        }else{
            return_ret = myfounction.low_price_recommend(
                        x["flight_date"].s(),
                        x["flight_departure"].s(),
                        x["flight_arrival"].s(),
                        x["flight_agent"].s(),
                        x["flight_retCounts"].s());
            return crow::response(return_ret);
        }
    });
  • myfounction为我封装的一个类创建的对象,low_price_recommend为其中的一个方法。返回一个crow::json::wvalue。
  • 变量x为具体传进来的参数
  • crow::json::wvalue为返回的json格式数据
    通过x[“”].s()将对应的参数转成string

可能出现的问题

  • CMake 找不到asio库,例如如下所示:
CMake Error at /usr/local/share/cmake-3.24/Modules/CMakeFindDependencyMacro.cmake:47 (find_package):
By not providing "Findasio.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "asio", but
CMake did not find one.

Could not find a package configuration file provided by "asio" with any of
the following names:

asioConfig.cmake
asio-config.cmake

Add the installation prefix of "asio" to CMAKE_PREFIX_PATH or set
"asio_DIR" to a directory containing one of the above files. If "asio"
provides a separate development package or SDK, be sure it has been
installed.
Call Stack (most recent call first):
/usr/local/lib/cmake/Crow/CrowConfig.cmake:32 (find_dependency)
CMakeLists.txt:6 (find_package)

-- Configuring incomplete, errors occurred!
See also "/root/flight_query_system/query_system/build/CMakeFiles/CMakeOutput.log".
  • 解决
  • 打开并编辑这个文件/usr/local/lib/cmake/Crow/CrowConfig.cmake

大概在30行左右,将这行

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

替换为

list(APPEND CMAKE_MODULE_PATH ${CROW_CMAKE_DIR})

再次感谢Crow项目维护成员Luca Schlecker老哥的解答,以及所有维护此项目的成员。

官方GITTER讨论聊天室——crowfork/community


解决跨域问题

#include <crow.h>
#include "query/query.h"
#include "common/common.h"
#include "crow/middlewares/cors.h"

int main(){

    crow::App<crow::CORSHandler> app;
    auto& cors = app.get_middleware<crow::CORSHandler>();
	cors
		.global()
		.origin("*")
		.headers("origin, x-requested-with, accept, access-control-allow-origin, authorization, content-type")
		.methods("POST"_method, "GET"_method, "PUT"_method, "DELETE"_method, "PATCH"_method, "OPTIONS"_method);


    //测试
     CROW_ROUTE(app, "/hello")([](){
        return "Hello world";
    });
     app.port(18888).multithreaded().run();
}

### C++ Web 开发框架概述 对于C++开发者来说,选择合适的Web开发框架可以显著提高生产力并简化复杂的网络应用开发过程。以下是几个常见的C++ Web开发框架及其特点: #### 1. **Wt (Web ToolKit)** Wt 是一个用于创建高性能、高可扩展性的C++ Web应用程序的开源库[^1]。它的主要特点是支持服务器端的小部件模型,允许开发者像编写桌面GUI一样构建Web界面。此外,Wt 提供了内置的安全机制以及对AJAX和WebSocket的支持。 示例代码展示如何初始化一个简单的Wt 应用程序: ```cpp #include <Wt/WApplication> #include <Wt/WServer> class MyApp : public Wt::WApplication { public: MyApp(const Wt::WEnvironment& env); }; MyApp::MyApp(const Wt::WEnvironment& env) : Wt::WApplication(env) { setTitle("Simple Example"); } int main(int argc, char** argv) { return Wt::WRun(argc, argv, [](const Wt::WEnvironment& env) { return new MyApp(env); }); } ``` #### 2. **Crow** Crow 是另一个轻量级的C++微服务框架,专注于快速原型设计和简单部署[^5]。它通过回调函数处理HTTP请求,并提供了灵活的路由配置选项。尽管 Crow 并未被提及在提供的引用中,但它是一个非常流行的现代C++ Web框架之一。 下面是一段使用 Crow 处理GET请求的例子: ```cpp #include "crow_all.h" int main() { crow::SimpleApp app; CROW_ROUTE(app, "/hello")([](){ return "Hello world!"; }); app.port(18080).multithreaded().run(); } ``` #### 3. **CppCMS** CppCMS 是一种高效的C++ Web开发框架,专为构建动态网站而设计。该框架强调性能优化和技术灵活性,在多线程环境下表现尤为突出[^3]。虽然具体描述并未出现在给定的参考资料里,但基于其社区活跃度实际应用场景来看,它是值得考虑的选择之一。 --- ### 总结对比 | 框架名称 | 主要特性 | |----------|----------------------------------------------------------------------------------------------| | Wt | 支持小部件模型、安全性强、适合复杂交互式网页 | | Crow | 轻量化实现、易于学习和集成 | | CppCMS | 高效运行时性能、良好的文档支持 | 每种框架都有各自的优势领域,请根据项目需求和个人偏好做出最终决策。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半生瓜のblog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值