小编Lex*_*Lex的帖子

CMake:包含目录的target_link_libraries传播

我有一个小的静态库,它需要boost标头,并且需要include目录中的“ include”目录。

...
add_library(alib STATIC ...)
target_include_directories(alib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_include_directories(alib PRIVATE ${Boost_INCLUDE_DIRS})
...
Run Code Online (Sandbox Code Playgroud)

我在alib的系统上有另一个安装,正是$ {Boost_INCLUDE_DIRS}指向的位置,但这是系统的其他软件包所需的较旧版本。关键是我想构建自定义版本的alib作为项目的目标。因此,非常重要的一点是,系统alib中的任何内容都不会包含或链接到该文件。

现在,我有另一个库mylib依赖于alib,因此我执行以下操作:

...
add_library(mylib STATIC ...)
target_link_libraries(mylib PUBLIC alib)
target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS})
...
Run Code Online (Sandbox Code Playgroud)

target_link_libraries(mylib PUBLIC alib)调用适当加从包括alib但包括他们的后由第二行中指定包括target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS}),即使他们事后指定。

问题是${EXPAT_INCLUDE_DIRS}指向系统alib所在的包含路径。

它不应该的问题,如果CMake的将正确追加包括即被提供它们的顺序,目录中的那些target_link_libraries(mylib PUBLIC alib)那么的那些target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS})

但是,cmake不遵守此顺序,而是在命令行末尾附加了target_link_libraries调用中的include目录,从而导致系统头文件而不是我的alib版本头文件被拾取。

我无法以任何方式更改alib目录的名称。我当前的解决方案是通过手动引用alib目标来破解对target_include_directories的自定义调用:

target_include_directories(mylib PUBLIC $<TARGET_PROPERTY:alib,INCLUDE_DIRECTORIES>)
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?我怎么能强迫的CMake包含的目录alib 右远target_link_directories …

cmake

7
推荐指数
1
解决办法
3930
查看次数

通过QDataStream序列化QVariant

我可能写错了,但这是我正在尝试执行的代码并且它无法执行预期的操作:

#include <QDataStream>
#include <QByteArray>
#include <QVariant>
#include <iostream>


int main(){

    QByteArray data;
    QDataStream ds(&data,QIODevice::WriteOnly);
    QVariant v(123);
    ds << v;
    std::cout <<"test: " <<  data.data() << std::endl; // "test: 123"


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出QVariant类文档中的示例:

http://qt-project.org/doc/qt-5.1/qtcore/qvariant.html#type

它应该正确地将值123序列化到QByteArray但不这样做,而是只写出:

test: 
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何解决这个问题?

编辑

好吧,也许不清楚,但这是原始问题:

我可能有任何存储在QVariant中的QVariant内置类型,如QStringList,QString,double,int等....

我想要的是一种将QVariant序列化为字符串并将其恢复而无需为每种类型自行完成的方法.据我所知,QVariant :: toString()方法不适用于通过QVariant接受的所有类型,我认为通过QDataStream传递可以传递给我一个QVariant的序列化版本.

编辑2

感谢piotruś的回答,我能够回答我的问题.这是程序:

int main(){
    QString str;
    {
        //serialization
        QByteArray data;
        QDataStream ds(&data,QIODevice::WriteOnly);
        QVariant v(123);
        ds << v;
        data = data.toBase64();
        str = QString(data);
        cout << str.toStdString() << endl;

    }
    {
        //deserialization
        QByteArray data = str.toLatin1();
        data …
Run Code Online (Sandbox Code Playgroud)

c++ serialization qt qvariant

6
推荐指数
1
解决办法
6536
查看次数

用于纹理上传的OpenGL PBO,无法理解一件事

好的,我在这里阅读了有关PBO的所有内容:http://www.opengl.org/wiki/Pixel_Buffer_Object ,还有http://www.songho.ca/opengl/gl_pbo.html,但我还有一个问题,我不知道我知道在我的情况下,我是否会从公益组织中获得任何好处:

我正在做视频流,目前我有一个函数将我的数据缓冲区复制到3个不同的纹理,然后我在片段着色器中做一些数学运算并显示纹理.

我认为PBO可以增加上传时间CPU - > GPU,但是这里就是说,我们这里的例子来自上面的第二个链接.

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[nextIndex]);

        // map the buffer object into client's memory
        // Note that glMapBufferARB() causes sync issue.
        // If GPU is working with this buffer, glMapBufferARB() will wait(stall)
        // for GPU to finish its job. To avoid waiting (stall), you can call
        // first glBufferDataARB() with NULL pointer before glMapBufferARB().
        // If you do that, the previous data in PBO will be discarded and
        // glMapBufferARB() returns a …
Run Code Online (Sandbox Code Playgroud)

c++ opengl textures video-streaming pbo

3
推荐指数
1
解决办法
3293
查看次数

标签 统计

c++ ×2

cmake ×1

opengl ×1

pbo ×1

qt ×1

qvariant ×1

serialization ×1

textures ×1

video-streaming ×1