利用msys2使用libtorrent库的个人记录

在msys2的包存储库中存在libtorrent-rasterbar的预编译包

可以参考

https://packages.msys2.org/packages/mingw-w64-ucrt-x86_64-libtorrent-rasterbar

使用msys2中的C++构建工具应该可以直接使用这个预编译库

我简单试了一下确实可以, 不过我没有使用cmake

不使用cmake工具最大的问题就是需要手动列举出所有的依赖库, 好像不支持通配符语法比如"-lboost_*"这样, 所以我手动将我电脑上所有的"boost"库的文件全部列举了出来, 包括其他依赖的库, 

"-ltorrent-rasterbar"这个参数指的就是libtorrent库本身的链接文件, 这种写法可以忽略文件名开头的"lib"和末尾的".a"

非常重要的一点是需要编译器能自动在默认路径找到头文件跟静态库, 因为我是使用msys2的包管理器安装的libtorrent库,所以包括依赖的boost库都自动安装到了默认能找到的路径中,否则需要手动指定头文件跟静态库的路径

下面是我没有使用cmake工具而是直接使用g++加参数编译的vscode任务配置参考

其中最重要的是"-l"开头导入的库, 大多都是"boost"库, 添加了"-static"参数静态链接所有依赖项, 输入的是单文件使用了vscode的内置参数"${file}",会将运行任务时正在编辑的文件作为输入, 在当前工作目录的"out"子目录中输出"${workspaceFolder}/out/${fileBasenameNoExtension}.exe" 其他的参数是一些比如是否启用严格类型转换检查的选项等

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "C/C++: g++ build active file",
      "command": "C:/Users/PC/AppData/Local/Programs/msys2/ucrt64/bin/g++",
      "args": [
        "-m64",
        //"-O2",
        "-pedantic-errors",
        "-Woverflow",
        "-Wconversion",
        "-Werror",
        "-Wextra",
        "-std=c++20",
        "-fconcepts",
        "-static",
        "${file}",
        "-ltorrent-rasterbar",
        "-lboost_atomic-mt",
        "-lboost_charconv-mt",
        "-lboost_chrono-mt",
        "-lboost_container-mt",
        "-lboost_context-mt",
        "-lboost_contract-mt",
        "-lboost_coroutine-mt",
        "-lboost_date_time-mt",
        "-lboost_exception-mt",
        "-lboost_fiber-mt",
        "-lboost_filesystem-mt",
        "-lboost_graph-mt",
        "-lboost_iostreams-mt",
        "-lboost_json-mt",
        "-lboost_locale-mt",
        "-lboost_log-mt",
        "-lboost_log_setup-mt",
        "-lboost_math_c99-mt",
        "-lboost_math_c99f-mt",
        "-lboost_math_c99l-mt",
        "-lboost_math_tr1-mt",
        "-lboost_math_tr1f-mt",
        "-lboost_math_tr1l-mt",
        "-lboost_nowide-mt",
        "-lboost_numpy311-mt",
        "-lboost_prg_exec_monitor-mt",
        "-lboost_program_options-mt",
        "-lboost_python311-mt",
        "-lboost_random-mt",
        "-lboost_regex-mt",
        "-lboost_serialization-mt",
        "-lboost_stacktrace_noop-mt",
        "-lboost_stacktrace_windbg-mt",
        "-lboost_stacktrace_windbg_cached-mt",
        "-lboost_system-mt",
        "-lboost_test_exec_monitor-mt",
        "-lboost_thread-mt",
        "-lboost_timer-mt",
        "-lboost_type_erasure-mt",
        "-lboost_unit_test_framework-mt",
        "-lboost_url-mt",
        "-lboost_wave-mt",
        "-lboost_wserialization-mt",
        "-lssl",
        "-lcrypto",
        "-lcrypt32",
        "-lws2_32",
        "-lwininet",
        "-lshlwapi",
        "-lIphlpapi",
        "-lMswsock",
        "-o",
        "${workspaceFolder}/out/${fileBasenameNoExtension}.exe"
      ],
      "options": {
        "cwd": "C:/Users/PC/AppData/Local/Programs/msys2/ucrt64/bin/"
      },
      "problemMatcher": [
        "$gcc"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    },
  ]
}

 

 

一个简单的示例是这样

这个示例下载一个链接, 下载之前添加了一个已知的对等点"192.168.0.110:6881" 是我本地局域网中的另一个设备, 端口号是这个设备上的bt应用设置的侦听端口号

把这个设备中已经下载完毕的文件下载到当前设备上, 保存的位置是当前工作文件夹, 但是可能也会从其他对等点下载

但是没有进度提示

#include <libtorrent/session.hpp>
#include <libtorrent/add_torrent_params.hpp>
#include <libtorrent/torrent_handle.hpp>
#include <libtorrent/magnet_uri.hpp>
#include <iostream>
int main(int argc, char const* argv[])
{
        
        lt::session ses{};
        auto str = u8"";//magnet 链接字符串

        std::string strstr{reinterpret_cast<const char*>(str)};

        lt::add_torrent_params atp = lt::parse_magnet_uri(strstr);
        boost::asio::ip::address_v4 ip_v4 = boost::asio::ip::address_v4::from_string(reinterpret_cast<const char*>(u8"192.168.0.110"));
        boost::asio::ip::address ip{ip_v4};



        atp.peers.push_back(libtorrent::tcp::endpoint{ip, 6881});

        atp.save_path = "."; // save in current dir
        lt::torrent_handle h = ses.add_torrent(atp);
       
        // ...

        std::cout << "ok" << std::endl;

        int n;

        std::cin >> n;
        
}

 

posted @ 2024-11-25 13:55  FfD4edyo  阅读(102)  评论(0)    收藏  举报