我有一个小的静态库,它需要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 …
我可能写错了,但这是我正在尝试执行的代码并且它无法执行预期的操作:
#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) 好的,我在这里阅读了有关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)