我已经gdbserver附加到一个进程并且在远程机器上工作正常,端口 9999。在我的本地机器上,从命令行:
$ gdb
(gdb) target remote localhost:9999
Run Code Online (Sandbox Code Playgroud)
工作得很好。我正在尝试配置 Vs Code 调试器,以便我可以在这种情况下拥有 GDB 前端。这是我的启动 JSON。
"version": "0.2.0",
"configurations": [
{
"name": "GDB",
"type": "cppdbg",
"request": "attach",
"miDebuggerServerAddress": "localhost:9999",
"program": "path-to-cross-compiled-binary-with-same-debug-symbols",
"linux": {
"MIMode": "gdb",
},
}
]
Run Code Online (Sandbox Code Playgroud)
这里有几个问题。首先,为什么是“程序”?在这种情况下,gdb 不需要任何程序名称来启动。程序已经在远程运行,gdbserver 已经连接到它。我只是想让 gdb 客户端连接到端口 9999。但无论如何,继续前进。
它要我提供一个 processId。这也没有意义,我已经在远程连接了。有趣的部分是:
当然,如果我使用调试器服务器地址,服务器已经附加到 PID 并且在这种情况下不能使用 processId 是有道理的。但是如果我忽略它,VS Code 会给出 1. 错误。这在某种程度上是循环的。
任何人都可以使用 gdbserver 地址附加到 VS Code C++ 调试器中的远程进程,这是我的问题。我的启动文件有什么问题?
在 Andrew Koenig 的《Accelerated C++》一书中,他展示了以下代码:
vector<double> emptyvec()
{
vector<double> v; // no elements
return v;
}
grade(midterm, final, emptyvec());
Run Code Online (Sandbox Code Playgroud)
现在,grade 函数接受对 的 const 引用vector<double>。这对我来说意味着应该复制emptyvec()返回的临时对象,因为它是在堆栈中作为局部变量创建的,并且别名对我来说似乎很奇怪。这究竟是如何运作的?同样在另一页上,他将 const 引用传递给一个函数,该函数按值获取其参数并修改它们。是否可以将 const 引用vector<double>传递给参数需要为 的函数vector<double>?
我发现了这个名为cpp-httplib的仅标头库,它似乎可以很好地满足我的目的。我需要通过 HTTP 请求控制摄像头。例如,我可以使用以下方法读取相机的当前位置:
httplib::Client cli("192.170.0.201", 8080);
auto res = cli.Get("/ptz.stats/present_pos");
Run Code Online (Sandbox Code Playgroud)
对应于以下 Curl 命令;
卷曲-X GET“ http://192.170.0.201:8080/ptz.stats/present_pos ”
现在,我想使用 POST 请求移动相机。使用curl,我可以使用以下命令将相机向左移动:
卷曲-X POST“ http://192.170.0.201:8080/ptz.cmd/?pan_left=50 ”
我想通过httplib使用发出完全相同的 POST 请求
httplib::Client cli("192.170.0.201", 8080);
httplib::Params params{
{ "pan_left", "50" }
};
auto p = cli.Post("/ptz.cmd", params);
Run Code Online (Sandbox Code Playgroud)
这没有任何作用。我可以看到相机,并且curl 命令会移动它。httplib那么,我是否以错误的方式将 POST 请求转换为格式?您如何称呼该curl 请求httplib?
PS:httplib可能不是一个流行的库,但它有简洁的文档,我认为任何使用 Web 请求和 C++ 的人都可以提供帮助。
让我举一个代码示例.
#include <iostream>
#include <utility>
#include <tuple>
template <typename Service>
struct SubscriberImpl {
virtual void handleService(Service const&) = 0;
};
template <typename...ServiceType>
struct Subscriber : SubscriberImpl<ServiceType>... {
};
struct IntService {};
struct FloatService {};
template <typename StatusUpdatePolicy, typename... ServiceType>
struct StatusUpdater : Subscriber<ServiceType...>
{
StatusUpdater(StatusUpdatePolicy const& statusUpdater)
: m_statusUpdater{statusUpdater}
{}
// wont work
void handleService(IntService const& service) override {
m_statusUpdater.updateService(service);
}
void handleService(FloatService const& service) override {
m_statusUpdater.updateService(service);
}
StatusUpdatePolicy m_statusUpdater;
};
struct DummyPolicy {
void updateService(IntService const& service) { …Run Code Online (Sandbox Code Playgroud) 我正在使用 Emacs org-mode 做笔记并将其发布为 HTML 以便更好地阅读。但脚注出现在最后的单独部分中。我想在它们发生的部分中查看它们,例如组织模式手册。例如,我有这样的东西;
This[fn:1] will be a footnote.
...
[fn:1] This is the footnote reference.
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能在出现的部分的末尾而不是在整个文档的末尾查看参考文献?顺便说一句,脚注也没有链接。当我点击其中一个时,我不会注意到该特定脚注。
我试图cons-cell用C++中的函数式编程语言模拟列表结构constexpr.我有一种pair类型,一开始.这是两个不同的东西的持有者,但也支持嵌套对.这是代码.
template <typename E1, typename E2>
struct pair {
constexpr pair()
:_car{E1{}}, _cdr{E2{}}
{}
constexpr pair(const E1 &car, const E2 &cdr)
:_car{car}, _cdr{cdr}
{}
constexpr auto car() const{
return _car;
}
constexpr auto cdr() const{
return _cdr;
}
friend std::ostream& operator<<(std::ostream& str,
pair<E1, E2> p){
if(p == pair{})
return str;
str << p.car() << " " << p.cdr();
return str;
}
template <typename Functor>
friend constexpr auto fmap(Functor f,
const pair<E1, E2> p){
if …Run Code Online (Sandbox Code Playgroud) 我有一个这样的基础抽象类;
class X {
public:
virtual ~X(){}
virtual doSomething() = 0;
};
Run Code Online (Sandbox Code Playgroud)
然后我用Y,Z等几个类来实现它,每个类都有自己的构造函数,析构函数和doSomething实现.在我的主要功能中;
int main(){
std::vector<X *> v;
X *x1 = new Y();
X *x2 = new Z();
v.push_back(x1);
v.push_back(x2);
for(auto p : v){
p->doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
这会按预期调用各自的doSomething实现.但我的问题是我使用指针抽象类来通过其基类操作派生类的层次结构.这迫使我使用new在堆上创建实例,然后我必须手动删除它们.有没有办法做这样的事情;
int main(){
std::vector<X> v;
Y x1();
Z x2();
v.push_back(x1);
v.push_back(x2);
for(auto p : v){
p.doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我离开主要时,将自动调用析构函数.我知道我不能创建一个抽象类的成员,但使用指针来实现这一切似乎很奇怪.当然必须有一种方法可以在没有指针和新删除的情况下执行此操作.如果有人向我展示了最佳实践,那将会很棒.
通过本书学习,它介绍了如何实现像更复杂的操作operator*的std::atomic<T>.实现使用compare_exchange_weak,我想我明白这是如何工作的.现在,我自己实现了一些东西,看一看.
#include <type_traits>
#include <atomic>
#include <iostream>
/*template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
std::atomic<T>& operator*=(std::atomic<T>& t1, T t2) {
T expected = t1.load();
while(!t1.compare_exchange_weak(expected, expected * t2))
{}
return t1;
}*/
template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
std::atomic<T>& operator*=(std::atomic<T>& t1, T t2) {
T expected = t1.load();
t1.compare_exchange_weak(expected, expected * t2);
return t1;
}
int main() {
std::atomic<int> t1 = 5;
std::atomic<int> t2;
t2 = (t1 *= 5).load();
std::cout << "Atomic t1: " << …Run Code Online (Sandbox Code Playgroud) 我正在尝试在MSYS2上使用OpenGL。我安装了mingw-w64软件包,例如SDL2,glew,glm,mesa等。
gcc main.c -o main -lSDL2 -lGLEW -lGLU -lGL
Run Code Online (Sandbox Code Playgroud)
这就是我在Linux上编译东西的方式,因此我认为它会类似。但是-lGL给我带来了问题。我找不到MSYS2的任何OpenGL库。我按我说的安装了台面,但没有运气。我应该使用驱动程序附带的Windows版本并链接到该版本吗?我不知道该怎么办。
我从Windows复制了OpenGL32.dll和lib文件到mingw64 / lib文件夹,并将它们重命名为libGL,但是这当然不起作用。
我试图建立一个CI管道与C ++一起使用。我拥有的Docker容器不支持C ++ 17,所以我想从LLVM页面下载一个发行版并正确设置。然后,我将其提取/opt/clang7。我还使用CMake工具链文件,以便它将从此clang发行版中获取include和libs等。这是我的工具链文件clang7-ci.cmake:
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER /opt/clang7/bin/clang)
SET(CMAKE_CXX_COMPILER /opt/clang7/bin/clang++)
SET(CMAKE_FIND_ROOT_PATH /opt/clang7)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Run Code Online (Sandbox Code Playgroud)
我称其为CMake配置,cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/clang7-ci.cmake ..似乎是从工具链中获取了正确的clang和clang ++。正如我在CMake的配置输出中看到的那样:
-C编译器标识为Clang 7.0.1
-CXX编译器标识为Clang 7.0.1
-检查工作的C编译器:/ opt / clang7 / bin / clang
-检查工作的C编译器:/ opt / clang7 / bin / clang-工作
因此,我假设它正确使用了工具链目录,否则它将如何找到我设置的C ++编译器为clang ++。尽管如此,当我尝试使用以下命令进行构建时,它仍然给我以下错误cmake --build .:
在/builds/meguli/chops/tests/answer_life/answer_life.cpp:2包含的文件中:/builds/meguli/chops/tests/answer_life/../catch.hpp:644:10:错误:没有名为'is_same_v的模板'在命名空间'std'中;你是说'is_same'吗?
Run Code Online (Sandbox Code Playgroud)(!std::is_same_v<T, Rest> && ...) && is_unique<Rest...> ~~~~~^/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/type_traits:1517:12:注意:此处声明为'is_same'结构is_same ^
如您所见,它将在主机目录中/usr/lib/.../inclue/6.3.0查找包含文件。这不是我想要的,我想为C ++ 17构建,我希望它包括clang发行版中的标头。我设置SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)为它将在工具链中搜索包含目录,但是它不起作用。我怎样才能让它只在下搜索/opt/clang7?