我需要关闭 QML 代码的某些部分,因为这段代码是为了演示目的而完成的,它将在最终版本中删除。但是该产品将与这些演示功能一起使用很长时间,因此我不能使用带有演示功能的单独分支并不断将所有新功能合并到该分支 - 只是不方便。因此,运行此代码会很好,但在需要时可以轻松关闭和/或删除。在 C 和 C++ 中,我ifdef为此使用宏,但在 QML 中是否可以这样做?
在 Linux 上我使用
(gdb) i shared
Run Code Online (Sandbox Code Playgroud)
在 gdb 中,gdb 打印一个库列表,*如果没有加载调试符号,则带有星号,如果加载则不带星号,例如:
0x0000000100c18660 0x0000000100c489a0 Yes (*) /Users/anon/work/software/webrtc-audio-processing-0.1/build_darwin/../bin/darwin/lib/libwebrtc_audio_processing.0.dylib
0x0000000100c57ca0 0x0000000100c76978 Yes /Users/anon/work/software/speex/speex/speex-1.2rc2/build_darwin/../bin/darwin/lib/libspeex.1.dylib
Run Code Online (Sandbox Code Playgroud)
我发现在 LLDB 中我应该使用
(lldb) image list
做同样的事情。但是我得到了一个库列表,它对我是否为 lib 加载了调试符号没有任何说明,例如:
[181] 19269C1D-EB29-384A-83F3-7DDDEB7D9DAD 0x00007fff8d2d3000 /System/Library/PrivateFrameworks/CoreWiFi.framework/Versions/A/CoreWiFi
[182] 8D7BA9BA-EB36-307A-9119-0B3D9732C953 0x00007fff879ee000 /System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth
[183] 6F03761D-7C3A-3C80-8031-AA1C1AD7C706 0x00007fff92e52000 /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols
Run Code Online (Sandbox Code Playgroud)
那么如何检查 LLDB 是否加载了调试符号?
更新:我刚刚决定发布(lldb) image lookup -vn <function>(感谢吉姆)的输出,让其他人知道它是什么样子:
image lookup -vn Herqq::Upnp::HSsdp::init
2 matches found in libHUpnp.2.dylib:
Address: libHUpnp.2.dylib[0x00000000000283f0] (libHUpnp.2.dylib.__TEXT.__text + 150384)
Summary: libHUpnp.2.dylib`Herqq::Upnp::HSsdp::init() at hssdp.cpp:804
Module: file = "libHUpnp.2.dylib", arch = "x86_64"
CompileUnit: id = …Run Code Online (Sandbox Code Playgroud) 我在课堂上有两个模板操作符:
template<class T>
size_t operator()(const T& t) const {
static_assert(boost::is_pod<T>(), "Not a POD type");
return sizeof t;
}
template<typename... T>
size_t operator()(const boost::variant<T...>& t) const
{
return boost::apply_visitor(boost::bind(*this, _1), t);
}
Run Code Online (Sandbox Code Playgroud)
我boost::variant<some, pod, types, here>作为参数传递给这些运算符.GCC 4.8和llvm 6.0编译代码很好,选择boost::variant参数化运算符.gcc 4.7选择const T& t参数化运算符,因此由于静态断言而无法编译.
所以,我有一个问题,在这两者之间选择的规则是什么?我认为gcc 4.7必须有一个bug,但我没有任何证据.
让我们考虑这个简单的例子:
Class Emitter: public QObject {
...
signal:
surfaceDestroyed(QObject*);
public:
void emittingMethod(QObject* surface) {
emit surfaceDestroyed(surface);
delete surface;
}
}
Run Code Online (Sandbox Code Playgroud)
我有这种情况的排队连接
connect(emitterObject, SIGNAL(surfaceDestroyed(QObject*), receiverObject,
SLOT(onSurfaceDestroyed(QObject*)), Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)
在onSurfaceDestroyed方法中,取消引用并使用接收到的QObject
那么问题是这段代码的安全性如何?我在QT网站上已经阅读了很多相关信息,但我仍然没有清楚地了解这个问题.
在我看来,这个代码是不安全的,因为一旦处理了事件循环并且接收器对象访问释放的内存,就会发送信号,然后表面被破坏,而不是事件发生在receiverObject上,因此SIGSEGV
这是真实代码的简化示例,因此很难跟踪崩溃是否会因此而发生.
这是一个简单的测试程序,说明了我遇到的问题:
#include <iostream>
#include <stdlib.h>
#include <inttypes.h>
#include <vector>
using namespace std;
typedef unsigned char Byte;
int main( )
{
uint32_t ui32 = 12;
size_t sizeofUi32 = sizeof ui32;
cout << "sizeofUi32: " << sizeofUi32 << endl;
vector<Byte> v(10);
std::copy(&ui32, &ui32 + sizeof ui32, &v[4]);
uint32_t result = 0;
std::copy(&v[4], &v[4] + sizeof ui32, &result);
cout << "Result: " << result << " sizeofUi32: " << sizeofUi32 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sizeofUi32: 4
Result: 12 sizeofUi32: 17179869184
Run Code Online (Sandbox Code Playgroud)
我认为这个问题可能是由于std …
我知道我应该在处理TEXT类型的数据时使用它(我想那些可以归结为TEXT的数据),但这是唯一的情况吗?
例:
UPDATE names SET name='Mike' WHERE id=3
Run Code Online (Sandbox Code Playgroud)
我正在用C++编写一个SQL查询自动生成器,所以我想确保在不得不添加引号的情况下我不会错过案例.
例:
qint32 si32 = -1; // that gives us 0xFFFFFFFF
quint64 ui64 = si32; // that gives us 0xFFFFFFFFFFFFFFFF, that is expected
Run Code Online (Sandbox Code Playgroud)
期望的结果:
0xFFFFFFFF00000000
Run Code Online (Sandbox Code Playgroud)
当我试图像这样在si32上移位时
quint64 ui64 = si32 << 32;
Run Code Online (Sandbox Code Playgroud)
编译器警告我有关位移溢出的信息.
这应该是一项简单的任务,但我无法弄清楚如何做到这一点.这是一个unix C++代码(使用QT,但这没关系,普通的unix C++代码会这样做).
我很感激你的帮助.
我想在没有新的内存分配和复制的情况下在C或C++中连接2个字符串.可能吗?
可能的C代码:
char* str1 = (char*)malloc(100);
char* str2 = (char*)malloc(50);
char* str3 = /* some code that concatenates these 2 strings
without copying to occupy a continuous memory region */
Run Code Online (Sandbox Code Playgroud)
然后,当我不再需要它们时,我只是这样做:
free(str1);
free(str2);
Run Code Online (Sandbox Code Playgroud)
或者如果可能的话,我想在C++中实现相同的功能,使用std::string或者可能char*,但是在str3上使用new和delete(可能是void operator delete ( void* ptr, std::size_t sz )运算符(C++ 14)).
关于字符串连接有很多问题,但我没有找到一个问相同的问题.
我的应用程序根本无法链接到swscale库.我的意思是我试图在我的代码中使用的任何swscale方法都成为一个未定义的引用.我知道这个错误意味着什么 - 链接器找不到任何已使用函数的定义.
但问题是我确保:
-L/usr/local/Cellar/ffmpeg/2.8.2/lib -lswscale 在链接器输出中,链接器实际上找到了lib,否则会抱怨丢失 swscale图书馆真的存在:
$ll /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale*
输出:
-r--r--r-- 1 myuser admin 519K Nov 20 19:33 /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.1.101.dylib
lrwxr-xr-x 1 myuser admin 24B Nov 20 19:32 /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.dylib -> libswscale.3.1.101.dylib
-r--r--r-- 1 myuser admin 607K Nov 20 19:32 /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.a
lrwxr-xr-x 1 myuser admin 24B Nov 20 19:32 /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.dylib -> libswscale.3.1.101.dylib
Run Code Online (Sandbox Code Playgroud)
该库具有正确的架构:
$lipo -info /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.dylib
输出:
Non-fat file: /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.dylib is architecture: x86_64
Run Code Online (Sandbox Code Playgroud)
我的机器架构:
$uname -m
Run Code Online (Sandbox Code Playgroud)
输出:
x86_64
Run Code Online (Sandbox Code Playgroud)
符号存在于二进制文件中,例如:
$nm /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.1.101.dylib | grep sws_alloc_context
输出:
000000000004e3b4 T _sws_alloc_context
Run Code Online (Sandbox Code Playgroud)
这实际上是我正在尝试构建的QT应用程序.我应该提一下,我没有以同样的方式链接其他库的问题.我也使用以下方法成功编译 …