我参与了关于Linux中的库的一些争论,并想确认一些事情.
这是我的理解(请纠正我,如果我错了,我将在稍后编辑我的帖子),在构建应用程序时有两种使用库的方法:
静态库的明显优势是他们让整个应用程序是自包含的,而动态库的好处是"所以"文件可以被替换(即:如果它需要更新由于安全bug),无需重新编译基本应用程序.
我听说有些人区分共享对象和动态链接库(DLL),即使它们都是".so"文件.在Linux或任何其他POSIX兼容操作系统(即:MINIX,UNIX,QNX等)上进行C/C++开发时,共享对象和DLL之间是否有任何区别?我被告知一个关键的区别(到目前为止)是共享对象只是在运行时使用,而DLL必须首先使用应用程序中的dlopen()调用打开.
最后,我还听到一些开发人员提到"共享存档",根据我的理解,这些存档也是静态库本身,但直接由应用程序使用.相反,其他静态库将链接到"共享存档",以将一些(但不是全部)功能/资源从共享存档中提取到正在构建的静态库中.
提前谢谢大家的帮助.
在向我提供这些术语的上下文中,Windows开发人员必须学习Linux的实际上是错误的术语.我试图纠正它们,但是(不正确的)语言规范被卡住了.
LDOPTS+=-lmylib对于名为的库文件mylib.so).库必须在编译时出现,并在应用程序启动时出现.LDOPTS+=-lmylib对于名为mylib.a的库文件).库必须在编译时出现.dlopen()/ dlsym()命令,以便库不需要存在在构建时对程序进行编译.此外,库不需要在应用程序启动或编译时存在(必要),因为只有在调用dlopen/ dlsym调用时才需要它.LDOPTS+=-lmylibS用于名为mylib mylibS.a.a 的库文件).两者之间的区别在于,如果共享对象或DLL想要将共享存档静态链接到其自己的代码并且能够使共享对象中的函数可用于其他程序而不是仅使用它们,则需要此附加标志. DLL的内部.当有人为您提供静态库,并且您希望将其重新打包为SO时,这非常有用.库必须在编译时出现." DLL"和" shared library" 之间的区别只是我当时工作的公司(懒惰,不准确)的口语主义(Windows开发人员被迫转向Linux开发,术语卡住),坚持上述说明.
另外,在S"共享档案"的情况下,库名后面的尾随" "字面只是该公司使用的惯例,而不是一般的行业.
给定NxN二进制矩阵(仅包含0或1),我们如何才能找到包含全0的最大矩形?
例:
I
0 0 0 0 1 0
0 0 1 0 0 1
II->0 0 0 0 0 0
1 0 0 0 0 0
0 0 0 0 0 1 <--IV
0 0 1 0 0 0
IV
Run Code Online (Sandbox Code Playgroud)
对于上面的例子,它是一个6×6的二进制矩阵.在这种情况下,返回值将是单元格1:(2,1)和单元格2:(4,4).得到的子矩阵可以是正方形或矩形.返回值也可以是所有0的最大子矩阵的大小,在该示例中为3×4.
我找到了一些关于通过OpenCV缝合全景图像的基本工作示例.我还在API文档中找到了一些有用的文档,但是我无法通过提供其他信息来了解如何加快处理速度.
在我的例子中,我在一个20x20网格的单个帧中生成一组图像,总共400个图像被拼接成一个大的图像.这在现代PC上花费了大量时间,因此在开发板上可能需要数小时.
有没有办法告诉OpenCV实例有关图像的信息,比如我事先知道所有图像在网格上的相对位置?到目前为止,我看到的唯一API调用是将所有图像无差别地添加到队列中vImg.push_back().
参考
<http://docs.opencv.org/modules/stitching/doc/stitching.html><http://feelmare.blogspot.ca/2013/11/opencv-stitching-example-stitcher-class.html><http://ramsrigoutham.com/2012/11/22/panorama-image-stitching-in-opencv/>例如,Python 脚本可以通过docstrings. 它的巧妙之处在于,它们可以在每个函数级别、每个方法级别、每个类级别进行定义,最重要的是(在我的问题的上下文中):每个文件级别。例如,文件的顶部可能如下所示:
#!/usr/bin/env python
"""
@brief A script that does cool stuff.
"""
Run Code Online (Sandbox Code Playgroud)
这样做的bash脚本支持这样的功能?即是否有一种“标准化”的方法来生成文件级文档集(即脚本目的、usage语法等的人类可读描述;以便另一个脚本很容易自动解析/提取这些信息?我的目标是创建几个自我记录的调试脚本,如果已经有标准/事实上的最佳方法来做到这一点,我想避免重新发明轮子。
我正在寻找有关使用VIM作为IDE的建议.我通常用许多编程语言编写代码,包括C,C++,汇编程序,MATLAB,Maple,BASH脚本等等.
总的来说,为了保持一致性,我喜欢在我的大部分项目中使用单个IDE,并且我发现我在VIM中执行了大约90%的编码,并偶尔使用Eclipse代替C /中的某些项目C++(即:人们已将项目组合为Eclipse项目,或者来自www.microchip.com的PIC24/32项目).
我已经非常熟悉VIM的基本功能(Windows vs缓冲区,文本操作,脚本编写),并且希望将它用作我的主IDE.我已经从这里获得了一些提示:http: //vim.wikia.com/wiki/Use_Vim_like_an_IDE#Writing_Code
我已经在项目中使用了nerdTree插件进行目录浏览等,但我需要对代码完成和符号解析做些什么,因为这是我最关心的两个问题.
我意识到这有很多要问,而且我总是可以回到Visual Studio或Eclipse,但我真的只想要一个简单的跨平台控制台功能的模态编辑器来满足我的所有开发需求,而且没有一个主要的IDE在那里填补了这个需求.
谢谢大家.
众所周知,SO_REUSEPORT允许多个套接字侦听相同的IP地址和端口组合,它将每秒请求增加2到3倍,并减少延迟(~30%)和延迟标准差(8次):https ://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/
NGINX版本1.9.1引入了一项新功能,该功能支持使用 SO_REUSEPORT套接字选项,该选项适用于许多操作系统的较新版本,包括DragonFly BSD和Linux(内核版本3.9及更高版本).此套接字选项允许多个套接字侦听相同的IP地址和端口组合.然后内核负载平衡套接字上的传入连接....
如图所示,reuseport将每秒请求数增加了2到3倍,并减少了延迟和延迟的标准偏差.
SO_REUSEPORT适用于大多数现代操作系统:Linux(自2013年4月29日起内核> = 3.9),Free/Open/NetBSD,MacOS,iOS/watchOS/tvOS,IBM AIX 7.2,Oracle Solaris 11.1,Windows(仅表现为2个标志)在BSD上一起+ ,可能在Android上:https: //stackoverflow.com/a/14388707/1558037SO_REUSEPORTSO_REUSEPORTSO_REUSEADDR
Linux> = 3.9
- 此外,内核为
SO_REUSEPORT其他操作系统中找不到的套接字执行一些"特殊魔法" :对于UDP套接字,它尝试均匀分布数据报,对于TCP侦听套接字,它会尝试分发传入的连接请求 (通过调用接受的请求accept())均匀地跨越共享相同地址和端口组合的所有套接字.因此,应用程序可以轻松地在多个子进程中打开相同的端口,然后使用它SO_REUSEPORT来获得非常便宜的负载平衡.
同样众所周知,为了避免自旋锁定和高性能锁定,不应该有超过1个线程的套接字.即每个线程都应该处理自己的套接字以进行读/写.
accept()对于相同的套接字描述符是线程安全的函数,因此它应该被锁定 - 因此锁争用会降低性能:http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2007-06/msg00246.htmlPOSIX.1-2001/SUSv3 需要accept(),bind(),connect(),listen(),socket(),send(),recv()等作为线程安全函数.标准中可能存在关于它们与线程交互的一些含糊之处,但其意图是它们在多线程程序中的行为受标准控制.
我通常在Vim中编写大部分C项目.我很熟悉导航,搜索和替换,以及通过Ctags/Cscope进行索引.
如果可能的话,我想要的一个功能是键映射,它将在屏幕上的光标下显示变量的数据类型.
例如,如果我的光标在一个变量上,"test123"(即:int test123 = 0)有没有办法让类型(int)和其他一些关于Vim中另一个标签中显示的变量的细节?
此外,是否存在类似于结构变量的相似内容,并在描述性选项卡中显示其所有成员的列表以及类型(即:struct)?
我还注意到,有时在编码时,我在Vim顶部有一个标题为"[Scratch] [Preview]"的标签,似乎满足了这个要求,但我不知道触发它的是什么(搜索和Ctag搜索不是'似乎触发它).它看起来像这样:
name: myStruct::instanceOfStrct| 2 cmd: /^ int instanceOfStrct;$/
.. (up a dir) | 3 kind: m
</code/test/test.c | 4 struct: myStruct
|+config/ | 5 access: public
|+lib/ | 6 filename: /code/test/test.c
Run Code Online (Sandbox Code Playgroud)
我认为这在某种程度上已经存在于Vim中,但我不知道如何使用它.
谢谢.
我有一个.sln包含大量项目(~50)的大型Visual Studio 2010解决方案文件().每个项目都包含粗略20 .cpp和.h文件.在快速的Intel i7计算机上构建整个项目大约需要2个小时,所有依赖项都在快速SSD上本地缓存.
我试图复制我在这个主题上发现的现有实验,需要澄清如何:
MSBuild.exe.首先,/m和/maxcpucount选项是一样的吗?我已经阅读了一篇关于该/m选项的文章,该文章似乎并行构建了更多项目.这似乎与我通过GUI中的以下操作设置的选项相同:
Maximum number of parallel project builds还有另一种选择,/MP我可以通过以下方式访问GUI:
Multi-processor Compilation如果我错了,请纠正我,但这似乎表明该项目将.cpp并行构建多个文件,但没有选项指定多少文件,除非我必须在文本框中手动设置它(即:/MP 4或者/MP4.
似乎为了/MP工作,我需要禁用最小重建(即:)Enabled Minimal Rebuild: No (/GM-),它也不适用于预编译的头文件.我已经解决了预编译头文件问题,方法是将预编译头文件作为一个专用项目,该解决方案首先构建在所有其他项目之前.
问题:我如何在解决方案中为并行项目构建实现这些选项,并在项目中构建并行文件(.cpp),通过命令行使用MSBuild,并确认它们按预期工作?我的上述假设是否也正确?我的最终目标是测试构建项目的最多使用的核心总数,或者如果我的构建过程是I/O绑定而不是CPU绑定,甚至可能重载它.我可以在Linux中通过以下方式轻松完成此操作:
NUMCPUS=`grep …Run Code Online (Sandbox Code Playgroud) msbuild parallel-processing visual-studio-2010 multiprocessing visual-studio
我有大量的音频文件,我通过处理算法运行,试图从中提取某些数据(即:整个剪辑的平均音量).我有许多构建脚本,以前从Samba网络共享中提取输入数据,我已经创建了一个映射到via net use(即:)的网络驱动器M: ==> \\server\share0.
现在我有一个新的大型1TB SSD,我可以在本地存储文件并快速处理它们.为了避免大量重写我的处理脚本,我删除了网络驱动器映射,并使用localhost主机名重新创建它.即:M: ==> \\localhost\mydata.
当我使用这样的映射时,我是否有可能产生大量开销,例如数据必须通过Windows网络堆栈的一部分,或者操作系统是否使用任何快捷方式,因此它或多或少等于直接磁盘访问(即:机器知道它只是从自己的硬盘驱动器中提取文件).增加的延迟并不是我的担忧,但最大的持续平均吞吐量至关重要.
我问这个是因为我决定是否应该修改所有处理脚本以使用不同的网络路径样式.
额外问题:这同样适用于Linux主机:他们是否足够聪明,知道他们是从本地磁盘中提取的?