在C++中,我正在检查可用设备的数量,如下所示:
uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
cout << deviceCount << endl;
vkGetPhysicalDeviceProperties(device, &deviceProperties);
vkGetPhysicalDeviceFeatures(device, &deviceFeatures);
cout << deviceProperties.deviceName << endl;
Run Code Online (Sandbox Code Playgroud)
这是打印出来的1 Geforce GTX 1070
.
我的系统有一个GTX 1070和第四代intel 5处理器,带有集成显卡.根据我的理解,对于Vulkan应该足够好.
那么为什么我的程序只能拿起GTX 1070呢?它不应该也能找到集成显卡吗?
编辑:
根据cpuinfo的确切模型是: Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz
编辑2:
我的操作系统是Arch linux
我正在使用 typest 渲染一些东西,我想要并排显示 2 个图像,我弄清楚了如何垂直获取东西:
#figure(
(image("eulerian.svg", width: 10%),
image("lagrangian.svg", width: 10%)).join(),
caption: [A curious figure.],
) <glacier>
Run Code Online (Sandbox Code Playgroud)
我现在想知道如何使事情水平化。
我有一堆手臂组装件,C和C ++文件。gcc正在尝试链接它们,但是这些是针对嵌入式项目的。
我没有使用任何外部库,正在使用的所有代码都是由我编写的。似乎发生了错误,因为我有一个称为int kernel_main(void)
define 的函数main.c
,它试图调用其中包含标头的set_LED(int value)
定义(我确实在main.c文件中包含标头)。mailbox.cpp
mailbox.h
确切的错误是:
undefined reference to `__aeabi_unwind_cpp_pr1'
Run Code Online (Sandbox Code Playgroud)
我制作项目的方式是:-将所有源文件(.s,.c,.cpp)编译为目标文件(.o),而无需链接(-c),然后使用自定义链接器将它们链接在一起脚本。
编辑:我将添加一些信息,以使事情更清楚。
首先更改所有文件,以使所有文件均为C文件(无cpp扩展名),生成:
undefined reference to `set_LED'
Run Code Online (Sandbox Code Playgroud)
问题本身不太可能是名称修改,它可能与CPP和C的差异无关。
该问题很可能是链接器问题
这是构建过程:
编译c文件,例如:
arm-none-eabi-g++ -O0 -march=armv8-a source/MainFiles/mailbox.cpp -nostartfiles -c -o objects/MainFiles/mailbox.o
Run Code Online (Sandbox Code Playgroud)
(除了使用g ++代替gcc之外,编译C ++文件将是相同的)
链接所有内容:
arm-none-eabi-ld object1 object2... -o build/kernel.elf -T ./source/kernel.ld -I include_directory_1 -I include_directory_2 -L include_directory_1 -L indlude_directory_2
Run Code Online (Sandbox Code Playgroud)
包含目录是当前目录下的所有目录
编辑:错误回来了。忽略此问题中与名称修饰有关的部分。我需要修复的错误是:
./objects/Hardware/mailbox.o:(.ARM.exidx+0x18): undefined reference to `__aeabi_unwind_cpp_pr1'
Run Code Online (Sandbox Code Playgroud)
到目前为止,我所知道的是,这与取消堆栈和异常有关。似乎该函数在libgcc中定义。但是,我已使用-nostdlib
,我省略了它,并且在两种情况下错误仍然存在。我尝试过尽可能将文件扩展名更改为.c,并尽可能将文件扩展名更改为.cpp,但是错误始终存在。
仅在我只有1个cpp文件且其余文件均为C文件的情况下,此问题才得到修复(我尝试了,这不再是对的)。再次触发该错误的是我正在重构代码,并且想将几个函数移到新文件中。
换句话说,在不删除单个文件的情况下,声明一个wait(uint32_t time)
在mailbox.cpp中命名的函数是有效的,在具有相应标题声明的time.c(或cpp)文件中声明该函数,并将标题包括在mailbox.cpp中会破坏事情。注意:在移动函数时,我不会删除文件,而只是在每个文件中删除函数声明。
添加这样的存根:
void __aeabi_unwind_cpp_pr1()
{
}
Run Code Online (Sandbox Code Playgroud)
解决了该问题,该代码可以正常工作。但是我不喜欢这种解决方案。我不想在代码中神秘地调用一个无用的存根。我在当前的实现中不需要也不需要此函数,如何告诉编译器或链接器它们正在做的事情都需要此函数呢?
在添加几何着色器之前,我在顶点着色器中声明了一个变量:
out vec3 normal;
Run Code Online (Sandbox Code Playgroud)
由片段着色器接收为:
in vec3 normal;
Run Code Online (Sandbox Code Playgroud)
但是,如果我向程序添加几何着色器,链接器会告诉我法线尚未声明为前一阶段的输出。但我不确定如何在几何着色器中接收或发送输出。
我编写了一个基于体素化的光线追踪器,它按预期工作,但速度非常慢。
目前光线追踪器代码如下:
#version 430
//normalized positon from (-1, -1) to (1, 1)
in vec2 f_coord;
out vec4 fragment_color;
struct Voxel
{
vec4 position;
vec4 normal;
vec4 color;
};
struct Node
{
//children of the current node
int children[8];
};
layout(std430, binding = 0) buffer voxel_buffer
{
//last layer of the tree, the leafs
Voxel voxels[];
};
layout(std430, binding = 1) buffer buffer_index
{
uint index;
};
layout(std430, binding = 2) buffer tree_buffer
{
//tree structure
Node tree[];
};
layout(std430, binding …
Run Code Online (Sandbox Code Playgroud) 我有以下目录结构:
~/emsdk
~/opencv
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建 OpenCV.js
我愿意
cd ~/opencv
python ./platforms/js/build_js.py build_js --emscripten_dir=~/emsdk/
Run Code Online (Sandbox Code Playgroud)
结果是:
CMake Error at /usr/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake:100 (message):
Could not find toolchain file:
~/emsdk/cmake/Modules/Platform/Emscripten.cmake
Call Stack (most recent call first):
CMakeLists.txt:135 (project)
CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!
Traceback (most …
Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的类定义:
class A {
private:
Field f;
public:
/*A hundred methods all of which modify f*/
m1();
m2();
...
m100();
}
Run Code Online (Sandbox Code Playgroud)
我们事先知道,所有这些方法(如果调用)将修改f。
假设您有一个非常意大利面条的代码库。
您需要在运行时查找是否实际修改了f。
您可以使用gdb,在每个方法上设置一个断点,查看执行在哪里停止,然后展开堆栈以查看哪个方法称为m *()方法中的任何一个。这是非常慢的,容易发生人为错误,在使用emscripten的代码库中或者在设置某些状态后python调用C ++二进制文件的地方,这不一定是可能的...
您可以注释掉所有这些方法,并探索代码在编译器抱怨的所有位置。这比以前的要糟糕得多,并且它在运行时执行,因此很难确定将实际调用哪种方法。
与上述类似,您可以将所有上述方法标记为已弃用,但是它或多或少具有相同的问题。
有没有人建议确定何时何地实际修改字段?
假设我们有一个包含两个类别的对象C1和C2的库A。
对于C1中的每个元素,C2中都有一个兼容的元素。
假设我们要创建一个将一个函数转换为另一个函数的通用函数。
template<typename C1, typename C2>
C2 SpecialCast(C1 c1) {
/* do some generic work */
}
Run Code Online (Sandbox Code Playgroud)
这就要求我们总是写。SpecialCast<Type>(parameter)
但这是多余的,因为要知道转换类型就需要知道参数类型。因此,这给代码增加了不必要的冗长性。
理想的解决方案是定义一个vallid类型转换的头表,这样就可以做到:
template<typename C1>
C2 SpecialCast(C1 c1) {
/*get C2 from C1 using the table*/
/* do some generic work */
}
Run Code Online (Sandbox Code Playgroud)
但是我目前正在努力寻找一种以最简单的方式定义表的好方法。
我正在尝试使用 gcc 的泄漏清理选项来检测程序中的泄漏。
为此,我使用相关标志进行编译,运行我的程序,然后终止,这会产生以下输出:
==8013==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 72704 byte(s) in 1 object(s) allocated from:
#0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
#1 0x7f3ab2f8690d (<unknown module>)
#2 0x7f3ab2f50525 (<unknown module>)
Direct leak of 72704 byte(s) in 1 object(s) allocated from:
#0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
#1 0x7f3ab51d2aad (<unknown module>)
#2 0x7f3ab51c4475 (<unknown module>)
Direct leak of 256 byte(s) in 1 object(s) allocated from:
#0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
#1 0x562db822861c in RenderHandler::RenderHandler() ../Src/main.cpp:68
#2 0x562db8226ee2 in main ../Src/main.cpp:200 …
Run Code Online (Sandbox Code Playgroud) c++ debugging memory-leaks memory-leak-detector address-sanitizer