我正在编写一个跨平台程序,我想将其打包在 Windows 上。我通过将三个 DLL(Qt5Core、Qt5Widgets、Qt5Gui)放入构建目录中来让它运行,然后制作一个 tarball 并将其交给其他拥有 Windows 机器的人,但它无法在他的 Windows 机器上运行。我寻找一种方法来获取所需的其他内容,并找到了 Nathan Osman 关于 Windeployqt 的帖子,因此我将 Windeployqt.cmake 复制到 cmake/Modules 目录,但不知道如何使用它。有没有办法使用 CPack 制作一个包(即使它只是一个 tarball),其中包含在未安装编译器或 Qt 的 Windows 机器上运行程序所需的一切?
这是 CMakeLists.txt 文件,其中删除了一些(希望是不相关的)内容:
project(perfecttin)
cmake_minimum_required(VERSION 3.8.0)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD 17) # appeared in CMake 3.8
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
set(SHARE_DIR ${CMAKE_INSTALL_PREFIX}/share/perfecttin)
add_definitions(-DBOOST_ALL_NO_LIB)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
set(Boost_USE_STATIC_LIBS ON)
else ()
set(Boost_USE_STATIC_LIBS OFF)
endif ()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
find_package(LibPLYXX)
find_package(Qt5 COMPONENTS Core Widgets Gui LinguistTools REQUIRED)
find_package(Boost COMPONENTS program_options)
find_package(Threads)
qt5_add_resources(lib_resources perfecttin.qrc)
qt5_add_translation(qm_files …Run Code Online (Sandbox Code Playgroud) 我正在向 GraphQL 服务器发出大约 30,000 个查询;因为我有一个高延迟连接,所以我使用线程并行执行许多查询。当前每个查询都会建立一个新连接;我想重用连接,这应该会减少整个下载所需的时间。这是我的代码:
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/beast.hpp>
#include <boost/beast/ssl.hpp>
#include <boost/asio/ssl/error.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <chrono>
#include <vector>
#include <array>
#include <iostream>
#include "http.h"
namespace beast=boost::beast;
namespace http=beast::http;
namespace net=boost::asio;
namespace ssl=net::ssl;
using tcp=net::ip::tcp;
using namespace std;
namespace cr=chrono;
struct TimeBytes
/* Used to compute the latency and data rate, which will be used
* to compute the number of I/O threads for the next run.
*/
{
float ms;
int bytes;
};
cr::steady_clock clk;
vector<TimeBytes> timeBytes; …Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序,它有一个线程将一个点文件读入缓冲区,许多线程从缓冲区中获取点并构造它们的八叉树。八叉树的每个立方体都由一个读写锁(又名 shared_mutex)保护,其中有 67 个(如果有两个线程,现在有)。如果文件太大,程序就会死锁,我很难调试它。其中一个锁在 gdb 中看起来像这样:
[6] = {_M_impl = {_M_rwlock = {__data = {__readers = 1,
__writers = 0, __wrphase_futex = 1, __writers_futex = 0, __pad3 = 0,
__pad4 = 0, __cur_writer = 0, __shared = 0, __rwelision = 0 '\000',
__pad1 = "\000\000\000\000\000\000", __pad2 = 0, __flags = 0},
__size = "\001\000\000\000\000\000\000\000\001", '\000' <repeats 46 times>, __align = 1}}},
Run Code Online (Sandbox Code Playgroud)
大多数互斥锁有 __readers=1,一个有 __readers=3,一个有 __readers=4294967289 左右。这是没有意义的,因为只有两个线程,所以只有两个线程可以读取它们;在构建八叉树阶段,它们应该是写锁定而不是读锁定互斥锁,并且 -7 看起来像是七个线程在没有先读锁定的情况下对互斥锁进行了读解锁。试图在 __readers 上设置观察点不起作用;它使调试器崩溃,或类似的东西。
我写了一个关于锁定和解锁的包装器:
void lockBlockR(int block)
{
metaMutex.lock();
modReaders[block%modMutexSize]++;
metaMutex.unlock();
modMutex[block%modMutexSize].lock_shared();
} …Run Code Online (Sandbox Code Playgroud)