我想在禁用OpenCL的情况下构建静态版本的OpenCV(3).为此,我正在使用
cmake -D WITH_OPENCL=OFF -D BUILD_SHARED_LIBS=OFF
Run Code Online (Sandbox Code Playgroud)
在编译OpenCV时,以及其他参数(禁用我不需要的其他模块).cmake调用的输出包括以下行
- 使用OpenCL:没有
如果我理解正确,则意味着OpenCL被禁用.
现在,当链接到OpenCV的编译版本时,我得到以下消息(我编辑了路径):
[编辑] /lib/libopencv_core.a(ocl.cpp.o):在函数`initOpenCLAndLoad'中:ocl.cpp :(.text.initOpenCLAndLoad + 0x2b):警告:在静态链接的应用程序中使用'dlopen'需要在运行时来自用于链接的glibc版本的共享库
我知道这个消息意味着什么,但我对它的来源感到困惑 - 为什么在编译的OpenCV库中有OpenCL调用代码?是否还需要设置其他选项才能完全禁用OpenCL?
感谢你并致以真诚的问候
我试图将一个整数转换为像这样的浮点数(简化):
int64_t x = -((int64_t)1 << 63);
float y = x;
Run Code Online (Sandbox Code Playgroud)
使用64位Windows 7上的MSVC 2013,这可以正常工作,但在Ubuntu 14.04 64位上使用gcc 4.8,我得到x的正值.我禁用了所有优化并查看了gdb中的变量.我甚至尝试直接用gdb进行评估,以找出问题的原因:
(gdb) print (float)(-((int64_t)1 << 63))
$33 = 9,22337204e+18
(gdb) print (float)(-9223372036854775808)
$39 = 9,22337204e+18
Run Code Online (Sandbox Code Playgroud)
可以看出,即使添加显式强制转换也不能解决问题.我有点困惑,因为float应该能够容纳更大的数字(就绝对值而言).sizeof(float) == 4并sizeof(size_t) == 8在情况下,它很重要.似乎值-2 ^ 63是一些魔法限制,因为-2 ^ 63 + 1转换得非常好:
(gdb) print (float)(-((int64_t)1 << 63) + 1)
$44 = -9,22337149e+18
Run Code Online (Sandbox Code Playgroud)
在值<= - 2 ^ 63的转换中,符号丢失的原因是什么?值-2 ^ 63可以用int64_t和float表示; 它可以在上述其他平台上运行.
考虑以下MWE(https://godbolt.org/g/aydjpW):
#include <cstdlib>
#include <array>
template<size_t N> constexpr std::array<void*, N> empty_array{};
Run Code Online (Sandbox Code Playgroud)
我的目标是拥有一个大小数组,N其中每个元素都是默认初始化的(在这个MWE的情况下,a nullptr).g ++ 5.4.0 -std=c++11抱怨说
变量模板仅适用于-std = c ++ 14或-std = gnu ++ 14
我不明白为什么.根据http://en.cppreference.com/w/cpp/container/array,array<T, N>存在自C++ 11和隐式声明的构造函数
按照聚合初始化规则初始化数组
在http://en.cppreference.com/w/cpp/language/aggregate_initialization上链接到聚合初始化的描述之后,它说
如果初始化程序子句的数量小于成员数或初始化程序列表完全为空,则其余成员将进行值初始化.
因此,我的假设是我上面的代码是有效的C++ 11.我在这里想到的是变量模板以某种方式涉及,这需要C++ 14?