小编Kor*_*idu的帖子

CMake + GoogleTest

我刚刚下载了googletest,用CMake生成了它的makefile并构建了它.现在,我需要在我的测试项目中使用它.

有了CMake,我被告知不要直接指向gtest库(使用include _directorieslink_directories),而是使用find_package().

问题是,生成的gtest makefile没有安装目标.我无法理解find_package(GTest REQUIRED)如果没有某种安装可以工作.此外,将gtest文件夹作为子文件夹放在我的项目中是不可能的.

谢谢你的帮助.

cmake googletest

47
推荐指数
5
解决办法
3万
查看次数

如何使用C++软件实际运送GLSL着色器

在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着色器?

c++ opengl glsl

46
推荐指数
6
解决办法
3万
查看次数

CMake:何时使用add_definitions而不是set_target_properties(目标PROPERTIES COMPILE_DEFINITIONS定义)

在CMake文档中,我们可以阅读:

add_definitions

在当前目录及以下的源中为编译器命令行添加标志.

目录上的COMPILE_DEFINITIONS属性

COMPILE_DEFINITIONS:用于编译目录源的预处理器定义.

目标上的COMPILE_DEFINITIONS属性

COMPILE_DEFINITIONS:用于编译目标源的预处理器定义.

源文件上的COMPILE_DEFINITIONS属性

COMPILE_DEFINITIONS:用于编译源文件的预处理程序定义.

COMPILE_DEFINITIONSadd_definitions功能似乎重叠.COMPILE_DEFINITIONS财产似乎更灵活.

因此,似乎COMPILE_DEFINITIONS属性可以执行add_definitions所做的一切,甚至更多.

那么,在哪些情况下我们必须调用add_definitions因为COMPILE_DEFINITIONS属性不能使用?

c++ cmake

30
推荐指数
3
解决办法
4万
查看次数

C++ API设计中的Demeter定律

在他的"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)

我的问题:为什么后一个例子会产生比前者更松散耦合的类?

c++ law-of-demeter

15
推荐指数
2
解决办法
2079
查看次数

用于多个库和可执行文件的CMakeLists.txt文件

我刚开始玩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)

我想要:

  • 在需要时独立构建每个lib和exe.(所以我想我必须为每个lib和exe添加一个CMakeLists.txt文件);
  • 构建时,include和lib目录应该引用INSTALL目录; (这是不是一个好主意?)
  • 构建时,将依赖项添加到其他lib并重建它们(如果不是最新的).

我没有任何线索从哪里开始.请帮忙...

cross-platform cmake cross-compiling

12
推荐指数
1
解决办法
1万
查看次数

Qt 5的多个OpenGL视口

我想将3D场景渲染到不同的视口中.这些视口包含在"子窗口"中,它们有自己的菜单,如下所示: 在此输入图像描述

每个视口可以是:

  • 调整大小;
  • 隐;
  • 全屏显示;
  • 移动到应用程序的另一部分.

所以我们可以这样: 在此输入图像描述

我相信最好将每个视口嵌入到包含我的OpenGL小部件的Qt Widget中(是吗?).那么如何将我的3D场景渲染成几个Qt OpenGL小部件呢?

c++ opengl qt

11
推荐指数
1
解决办法
6333
查看次数

如何std :: mutex :: lock直到函数返回

我想回来一个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)

锁是否仍然是强制性的?为什么?

c++ concurrency thread-safety

10
推荐指数
2
解决办法
5122
查看次数

错误C2536的解决方法:无法在Visual Studio 2013中为数组指定显式初始化程序

以下代码无法使用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++ visual-studio c++11

9
推荐指数
1
解决办法
1万
查看次数

Q_INVOKABLE方法返回自定义C++类型

我有一个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++方法的返回类型.

c++ qt qml

9
推荐指数
2
解决办法
5753
查看次数

在MAC OSX上使用CMake生成.bundle文件

我想.bundleMac 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文件.

我在这做错了什么?

macos xcode cmake

8
推荐指数
2
解决办法
6909
查看次数