我有一个用QMake构建的Qt项目(称为"扫描仪"),我有2个子项目:一个名为"scannerlib"的静态库和一个使用该库的应用程序,称为"app"(目前,它只是一个主要的.cpp文件)
我的"scanner"文件夹包含文件scanner.pro:
QT += core testlib
QT -= gui
CONFIG += c++14
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = subdirs
SUBDIRS = app scannerlib
app.depends = scannerlib
Run Code Online (Sandbox Code Playgroud)
和两个子文件夹,包含.pro文件和源文件相关.scannerlib/scannerlib.pro:
TARGET = scannerlib
TEMPLATE = lib
CONFIG += staticlib
#I ommited SOURCES and HEADERS here for brevity
Run Code Online (Sandbox Code Playgroud)
app/app.pro:
TARGET = app
TEMPLATE = app
SOURCES = main.cpp
INCLUDEPATH += ../scannerlib
LIBS += -L../scannerlib -lscannerlib
Run Code Online (Sandbox Code Playgroud)
我成功构建了libscanner,但我无法在"app"中链接它.
错误:找不到-lscannerlib
检查后,libscannerlib.a已经成功构建,所以它应该不是问题.如果我删除-lscannerlib,我会得到一个未定义的引用.这似乎合法.
如果我将创建的"libscannerlib.a"从build文件夹移动到scanner/scannerll,这可以让qmake找到它,我可以获得成功的构建.
所以,问题看起来像是来自"-L ../ scannerlib".我应该用qmake在build文件夹中找到lib的方式放在那里?
我知道虚函数本质上是包含在vtable上的函数指针,这使得多态调用由于间接等而变慢.但是当调用是确定性的时候我想知道编译器优化.确定性,我指的是以下情况:
struct Foo
{
virtual void DoSomething(){....}
};
int main()
{
Foo myfoo;
myfoo.DoSemthing();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
struct Foo
{
virtual void DoSomething();
};
struct Bar : public Foo
{
virtual void DoSomething();
};
int main()
{
Foo* a = new Foo();
a->DoSomething(); //Overhead ? a doesn't seem to be able to change nature.
Foo* b = new Bar();
b->DoSomething(); //Overhead ? It's a polymorphic call, but b's nature is deterministic.
Bar* c = new Bar();
c->DoSomething(); //Overhead …
Run Code Online (Sandbox Code Playgroud) 目前,我正在学习单元测试,我想将测试集成到我当前的(10 个 OpenGL 实验文件)项目中。为此,我下载了 Boost.Test,虽然我可以弄清楚它在单个文件样本上的工作原理,但我不知道如何将它集成到我的项目中(我想使用静态链接版本)。
测试与应用程序本身不同的二进制文件吗?(如果它是一个二进制文件,如何运行它?)我应该为每个测试类创建一个测试文件吗?我的 CMakeLists 应该改变多少来反映这种集成?是否可以将测试与应用程序分离,以便我可以在没有安装 boost 的平台上构建我的应用程序?
我知道我有很多问题,但简单地说:Boost.Test 在现实生活中是如何使用的?
我不明白Qt如何删除所有QObject的子节点,如果它是静态分配的话,如果没有双重删除.
基本上,如果我按常规方式执行,它看起来像这样:
QWidget Window(nullptr);
QPushButton* button = new QPushButton(&Window);
Window.show();
return App.exec();
//When app ends, Window gets deleted
//because it was statically allocated
//And then, Window deletes button because it's its child.
Run Code Online (Sandbox Code Playgroud)
但我也可以不崩溃地做到这一点:
QWidget Window(nullptr);
QPushButton button(&Window);
Window.show();
return App.exec();
//When app ends, button then Window get deleted
//because they were statically allocated
//And then, Window (should) delete button AGAIN because it's its child, thus crashing
//the program. But it doesn't. Why ?
Run Code Online (Sandbox Code Playgroud)
Qt知道我是如何创建QPushButton的,还是我错过了什么?
我用pointfree.io玩了一下,当我输入"\ x - > x*x"(又名方形函数)时,它输出了这个
join (*)
Run Code Online (Sandbox Code Playgroud)
我不知道这个,我在Hoogle上查了一下:
-- | The 'join' function is the conventional monad join operator. It
-- is used to remove one level of monadic structure, projecting its
-- bound argument into the outer level.
join :: (Monad m) => m (m a) -> m a
join x = x >>= id
Run Code Online (Sandbox Code Playgroud)
我不知道这是如何工作来创建一个返回其参数的平方的函数.任何的想法 ?