我刚刚下载了googletest,用CMake生成了它的makefile并构建了它.现在,我需要在我的测试项目中使用它.
有了CMake,我被告知不要直接指向gtest库(使用include _directories
或link_directories
),而是使用find_package()
.
问题是,生成的gtest makefile没有安装目标.我无法理解find_package(GTest REQUIRED)
如果没有某种安装可以工作.此外,将gtest文件夹作为子文件夹放在我的项目中是不可能的.
谢谢你的帮助.
在OpenGL初始化期间,程序应该执行以下操作:
<Get Shader Source Code>
<Create Shader>
<Attach Source Code To Shader>
<Compile Shader>
Run Code Online (Sandbox Code Playgroud)
获取源代码可能就像将它放在一个字符串中一样简单:(示例摘自SuperBible,第6版)
static const char * vs_source[] =
{
"#version 420 core \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n"
"} \n"
};
Run Code Online (Sandbox Code Playgroud)
问题是很难直接在字符串中编辑,调试和维护GLSL着色器.因此,从文件中获取字符串中的源代码更容易开发:
std::ifstream vertexShaderFile("vertex.glsl");
std::ostringstream vertexBuffer;
vertexBuffer << vertexShaderFile.rdbuf();
std::string vertexBufferStr = vertexBuffer.str();
// Warning: safe only until vertexBufferStr is destroyed or modified
const GLchar *vertexSource = vertexBufferStr.c_str();
Run Code Online (Sandbox Code Playgroud)
现在的问题是如何使用您的程序发送着色器?实际上,使用您的应用程序运送源代码可能是个问题.OpenGL支持"预编译的二进制着色器",但Open Wiki声明:
程序二进制格式不打算传输.期望不同的硬件供应商接受相同的二进制格式是不合理的.期望来自同一供应商的不同硬件接受相同的二进制格式是不合理的.[...]
如何使用C++软件实际运送GLSL着色器?
在CMake文档中,我们可以阅读:
在当前目录及以下的源中为编译器命令行添加标志.
COMPILE_DEFINITIONS:用于编译目录源的预处理器定义.
COMPILE_DEFINITIONS:用于编译目标源的预处理器定义.
COMPILE_DEFINITIONS:用于编译源文件的预处理程序定义.
COMPILE_DEFINITIONS
和add_definitions
功能似乎重叠.COMPILE_DEFINITIONS
财产似乎更灵活.
因此,似乎COMPILE_DEFINITIONS属性可以执行add_definitions所做的一切,甚至更多.
那么,在哪些情况下我们必须调用add_definitions因为COMPILE_DEFINITIONS属性不能使用?
在他的"API Design for C++"一书中,Martin Reddy详细阐述了Demeter法则.他特别指出:
你永远不应该在通过另一个函数调用获得的对象上调用函数.
他用链接函数调用支持他的语句
Func()
{
[...]
m_A.GetObjectB().DoSomething();
[...]
}
Run Code Online (Sandbox Code Playgroud)
相反,他鼓励将B作为参数传递给函数,如:
Func(const ObjectB &B)
{
[...]
B.DoSomething();
[...]
}
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么后一个例子会产生比前者更松散耦合的类?
我刚开始玩CMake.我有类似的东西:
/DEV
|-- lib1
| CMakeLists.txt
|-- lib2
| CMakeLists.txt
|-- exe1
| CMakeLists.txt
/BUILD
|-- lib1
|-- lib2
|-- exe1
/INSTALL
|-- include
|-- lib
|-- bin
Run Code Online (Sandbox Code Playgroud)
我想要:
我没有任何线索从哪里开始.请帮忙...
我想将3D场景渲染到不同的视口中.这些视口包含在"子窗口"中,它们有自己的菜单,如下所示:
每个视口可以是:
所以我们可以这样:
我相信最好将每个视口嵌入到包含我的OpenGL小部件的Qt Widget中(是吗?).那么如何将我的3D场景渲染成几个Qt OpenGL小部件呢?
我想回来一个std::vector
.这std::vector
可以从其他线程(读和写)访问.std::mutex
功能完成返回后如何解锁我的刚才?
例如,在:
// Value.cpp
std::vector<int> GetValue()
{
std::lock_guard<std::mutex> lock(mutex);
// Do super smart stuff here
// ...
return m_value;
}
// MyThread.cpp
auto vec = myVec.GetValue();
Run Code Online (Sandbox Code Playgroud)
现在如果"在这里做超级聪明的东西"是空的:
// Value.cpp
std::vector<int> GetValue()
{
std::lock_guard<std::mutex> lock(mutex);
return m_value;
}
// MyThread.cpp
auto vec = myVec.GetValue();
Run Code Online (Sandbox Code Playgroud)
锁是否仍然是强制性的?为什么?
以下代码无法使用Visual Studio 2013进行编译,但应该:
class A
{
A() :m_array{ 0, 1, 2 } {} // error C2536: 'A::A::m_array' : cannot specify explicit initializer for arrays
private:
int m_array[3];
};
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅错误报告
有哪些可行的解决方法?
我有一个C++方法制作Q_INVOKABLE.我可以从QML调用这个方法,它在返回基本类型(如QString)时有效.但我不能用自定义类型.我该怎么做?我应该退回QVariant吗?理想情况下,如果可能的话,我想返回指向我的自定义类型的指针.
编辑 我做:
qmlRegisterType<MyType>("Mine", 1, 0, "MyType");
qmlEngine->rootContext()->setContextProperty("testObj", new MyType());
Run Code Online (Sandbox Code Playgroud)
我可以使用testObj全局对象或创建MyType QML组件.但我不能在一些javascript代码中使用它作为Q_INVOKABLE C++方法的返回类型.
我想.bundle
在Mac OSX 10.6.8
使用时在文件中生成可执行文件CMake
.我的CMakeLists.txt文件如下所示:
cmake_minimum_required(VERSION 2.8)
PROJECT(TESTProject)
SET(MACOSX_BUNDLE_BUNDLE_NAME TEST)
ADD_EXECUTABLE(TEST MACOSX_BUNDLE main.cpp)
SET_TARGET_PROPERTIES(TEST PROPERTIES MACOSX_BUNDLE TRUE)
Run Code Online (Sandbox Code Playgroud)
然后我打电话给CMake:
CMake -G"Xcode" .
Run Code Online (Sandbox Code Playgroud)
但是,当我编译这个程序时Xcode 3.2.1
,我经常得到一个TEST.app
文件而不是TEST.bundle
文件.
我在这做错了什么?