我有一个项目正在使用FreeImage和openCV,目前我们正在使用这两个方面的jpeg支持(我正在努力解决这个问题,但是现在它必须留下来).无论如何,FreeImage将libjpeg 7.0编译成静态库,而openCV的highgui库将它作为共享库链接(在我的系统上,Ubuntu 9,我已经安装了libjpeg 6.2).
它们链接到一个最终的库,用于链接到各种程序,java包装器等.所有这些工作正常,编译/链接时没有符号冲突或任何东西.但是,当我使用openCV cvLoadImage函数打开图像时,它会在读取标题时死亡,这很可能是由于6.2和7.0中标题之间的差异造成的.
如果我取消链接FreeImage(并注释掉需要它的代码),openCV调用再次开始工作,很明显FreeImage中的静态libjpeg符号与将从libjpeg共享库加载的符号冲突.我无法弄清楚的是为什么我的编译器在链接期间没有抛出错误,因为有两组libjpeg符号.另外,我已经尝试用7.0版本暂时替换我的系统的jpeglib.h头文件,看看openCV编译后是否会与freeimage带来的符号同步,似乎无济于事.
最后,我将一个printf放在libjpeg中的jpeg_read_header中,即freeimage编译,并重建它以查看openCV是否正在使用freeimage libjpeg定义.它没有打印出来所以我不得不假设.
所以我想我的问题是
1)为什么不链接静态libjpeg和共享libjpeg会因重复符号而产生链接错误?
2)有谁知道为什么这两件事彼此冲突?
编辑:在调试模式下编译openCV,然后在常规模式下再次编译似乎已经松动了一些东西并使其再次工作,不知道发生了什么.
我正在尝试调试我正在处理的应用程序上的段错误(当然在Linux上运行,所以我不能将它用作调试核心转储的后备).无论如何,我设置了"ulimit -c unlimited",雪豹报告"Segmentation fault(core dumped)",但是没有找到核心文件.Snow Leopard是否将它们置于特殊位置或者是否需要启用其他选项?当我谷歌这个时,令人惊讶的是很少...
我正在研究一种我正在尝试优化的算法,它基本上有点麻烦,其次是在一个紧凑的反馈中添加了一些内容.如果我可以为加法器使用进位保存添加,它会真正帮助我加快速度,但我不确定我是否可以通过添加来分配操作.
特别是如果我代表:
a = sa+ca (state + carry)
b = sb+cb
Run Code Online (Sandbox Code Playgroud)
我可以用s和c表示(a >>> r)吗?一个|怎么样?b和a&b?
我正在寻找从我的应用程序中抽象出数据库服务器细节的选项(在c ++中),我想编写我的代码以独立于实际的数据库后端.我知道MySQL有一个很好的库,但我不想被绑定到单个数据库实现.这有什么好的选择吗?
所以我正在研究一种文件格式,用于存储在某种范围内定义的结构化数据.最简单的例子就像浮动值随着时间的推移,但我正在设计它以允许每个点的多个维度和任意数据.我想将数据的结构存储在文件头中,因为它将允许一些简洁的功能.
起初我以为我会让用户使用类的层次结构来构建他们的数据结构,所以你可以这样做:
pf_type data = record(PF_DOUBLE) (
record("position")(
field("xp") &
field("yp") &
field("zp")) &
record("velocity")(
field("xv") &
field("yv") &
field("zv")) &
record("acceleration")(
field("xa") &
field("ya") &
field("za")));
Run Code Online (Sandbox Code Playgroud)
这相当于C中这样的东西:
struct {
struct position {
double xp,yp,zp;
}
struct velocity {
double xv,yv,zv;
}
struct acceleration {
double xa,ya,za;
}
}
Run Code Online (Sandbox Code Playgroud)
这并不可怕,但它仍然要求用户在读/写数据时单独定义实际使用的ac结构.
我认为如果他们能够定义一个他们传递给我的库的常规c-struct并且我在其上进行内省以获取写入该文件的信息,那就太好了.虽然我不知道在C++中是否可以远程实现类似的东西.我的想法是它可能正在使用一些模板元编程魔法,但它会非常混乱.所以我想我会向那些比我更了解C++的人征求一些想法.
我在我的内部循环中有一些代码,我正在使用它来为我正在编写的光栅化算法钳制一些错误值:
float cerror[4] = {
MINF(error[0], 1.0f),
MINF(error[1], 1.0f),
MINF(error[2], 1.0f),
MINF(error[3], 1.0f)
};
Run Code Online (Sandbox Code Playgroud)
MINF只是MINF(a,b)=((a)<(b))?(a):( b)
事实证明我有4个错误值我必须在这个内部循环更新所有浮点数,所以如果我能将它们全部存储在SSE寄存器中并且使用minps计算最小值而不是单独计算,那就太好了,但是编译器似乎并没有为我做这件事.
我甚至尝试将它移动到它自己的功能,所以我可以看到矢量化器输出:
void fclamp4(float* __restrict__ aa, float* __restrict__ bb) {
for (size_t ii=0; ii < 4; ii++) {
aa[ii] = (bb[ii] > 1.0) ? 1.0f : bb[ii];
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我类似的东西:
inc/simplex.h:1508:注意:未向量化:不支持的数据类型bool
inc/simplex.h:1507:注意:函数中的向量化0循环.
有没有办法更好地鼓励编译器为我做这个?如果我可以避免它,我宁愿不直接跳到教义,所以代码仍然是可移植的.是否有共同模式的一般参考?
最后,我的所有错误/错误/错误增量都存储在堆栈上的float [4]数组中,我是否需要手动对齐它们,或者编译器能否为我处理?
编辑:使用对齐类型进行游戏但仍然没有骰子.
#include <stdio.h>
#include <stdlib.h>
typedef float __attribute__((aligned (16))) float4[4];
inline void doit(const float4 a, const float4 b, float4 c) {
for (size_t ii=0; ii < 4; ii++) { …Run Code Online (Sandbox Code Playgroud) 我很好奇是否有任何项目可以采用LLVM解析树并从中重新生成源代码.我特别想到C/C++.
我有一个应用程序需要将数据流从一个进程发送到多个读取器,每个读取器都需要查看自己的数据流副本。这是相当高的速率(100MB/s 并不少见),所以我想尽可能避免重复。在我的理想世界中,Linux 会命名管道支持多个读取器,并为常见的单读取器情况提供快速路径。
我想要一些提供某种命名空间隔离措施的东西(例如:127.0.0.1 上的广播对我相信的任何进程开放......)。Unix 域套接字不支持广播,而且 UDP 无论如何都是“不可靠的”(在我的情况下,服务器将丢弃数据包而不是阻塞)。我以为我可以创建一个共享内存段并将公共缓冲区存储在那里,但这感觉就像重新发明轮子。在 linux 中是否有规范的方法来做到这一点?
我正在研究一个解析器组合库,我真的很喜欢我的解析器只是一个可调用的对象:
typedef std::function<parse_result(parse_stream)> parser;
Run Code Online (Sandbox Code Playgroud)
这使得解析器组合器很好,例如:
parser operator &(parser a, parser b) { return both(a,b); }
Run Code Online (Sandbox Code Playgroud)
但我想要两个功能:
1)我希望自动将字符串文字提升为解析器,以便您可以执行以下操作:
parser option = "<" & regexp("[^+>]+");
Run Code Online (Sandbox Code Playgroud)
2)我希望解析器有一个名称,我可以用它来进行错误格式化.在上面的"both"解析器的情况下,我可以打印我预期的a.name()和b.name().
到目前为止我尝试过的两个选项是
一个可调用的解析器类,这让我可以从字符串和std :: function实例构建,但是一般的callable必须首先转换为std :: function并从那里转换为解析器,而C++不会进行两次隐式转换
继承自std :: function所以我可以隐式转换函数,但这似乎有很多陷阱只是将callables转换为解析器.
有没有人对如何构建这个有任何想法?
我有一个类型Point,它只是以下的别名Vector3:using Point = Vector3;
我希望能够添加功能Point,但没有额外的状态。所以我想用继承自的类替换它Vector3:
class Point : public Vector3 {
using Base = Vector3;
using Base::Base;
Point(const Base& base) : Base(base) {}
Point(Base&&) : Base(std::move(base)) {}
Point& operator=(const Base& base) {
Base::operator=(base);
return *this;
}
Point& operator=(Base&& base) {
Base::operator(std::move(base));
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
这继承了基类构造函数,并允许转换/移动Vector3to的值Point,因为我们之前可以自由地这样做。
在此之前您可以做但无法使用此方法做的唯一事情是自由转换指针。 Point*->Vector3*仍然有效,但是Vector3*->Point*将不再隐式工作。
以这种方式替换 typedef 时是否还有其他极端情况?
编辑:到目前为止,我发现了一个问题,您无法转发声明类型别名,因此您可能让用户通过在标头中重新定义类型来解决该问题:typedef Vector3 Point这将因重构而中断。