小编Clo*_*oud的帖子

共享对象(.so),静态库(.a)和DLL(.so)之间的区别?

我参与了关于Linux中的库的一些争论,并想确认一些事情.

这是我的理解(请纠正我,如果我错了,我将在稍后编辑我的帖子),在构建应用程序时有两种使用库的方法:

  1. 静态库(.a文件):在链接时,将整个库的副本放入最终应用程序中,以便库中的函数始终可用于调用应用程序
  2. 共享对象(.so文件):在链接时,仅通过相应的头(.h)文件针对其API验证对象.直到运行时才需要实际使用该库.

静态库的明显优势是他们让整个应用程序是自包含的,而动态库的好处是"所以"文件可以被替换(即:如果它需要更新由于安全bug),无需重新编译基本应用程序.

我听说有些人区分共享对象和动态链接库(DLL),即使它们都是".so"文件.在Linux或任何其他POSIX兼容操作系统(即:MINIX,UNIX,QNX等)上进行C/C++开发时,共享对象和DLL之间是否有任何区别?我被告知一个关键的区别(到目前为止)是共享对象只是在运行时使用,而DLL必须首先使用应用程序中的dlopen()调用打开.

最后,我还听到一些开发人员提到"共享存档",根据我的理解,这些存档也是静态库本身,但直接由应用程序使用.相反,其他静态库将链接到"共享存档",以将一些(但不是全部)功能/资源从共享存档中提取到正在构建的静态库中.

提前谢谢大家的帮助.

更新


在向我提供这些术语的上下文中,Windows开发人员必须学习Linux的实际上是错误的术语.我试图纠正它们,但是(不正确的)语言规范被卡住了.

  1. 共享对象:程序启动时自动链接到程序中的库,作为独立文件存在.该库在编译时包含在链接列表中(即:LDOPTS+=-lmylib对于名为的库文件mylib.so).库必须在编译时出现,并在应用程序启动时出现.
  2. 静态库:在构建时合并到实际程序本身的库,用于包含应用程序代码的单个(更大)应用程序和在构建程序时自动链接到程序的库代码,以及包含两者的最终二进制文件主程序和库本身作为单个独立的二进制文件存在.该库在编译时包含在链接列表中(即:LDOPTS+=-lmylib对于名为mylib.a的库文件).库必须在编译时出现.
  3. DLL:基本上相同的共享对象,但是,而不是被包括在编译时链接列表,该库是通过加载dlopen()/ dlsym()命令,以便库不需要存在在构建时对程序进行编译.此外,库不需要在应用程序启动或编译时存在(必要),因为只有在调用dlopen/ dlsym调用时才需要它.
  4. 共享存档:基本上与静态库相同,但使用"export-shared"和"-fPIC"标志进行编译.该库在编译时包含在链接列表中(即:LDOPTS + = - lmylib,LDOPTS+=-lmylibS用于名为mylib mylibS.a.a 的库文件).两者之间的区别在于,如果共享对象或DLL想要将共享存档静态链接到其自己的代码并且能够使共享对象中的函数可用于其他程序而不是仅使用它们,则需要此附加标志. DLL的内部.当有人为您提供静态库,并且您希望将其重新打包为SO时,这非常有用.库必须在编译时出现.

其他更新

" DLL"和" shared library" 之间的区别只是我当时工作的公司(懒惰,不准确)的口语主义(Windows开发人员被迫转向Linux开发,术语卡住),坚持上述说明.

另外,在S"共享档案"的情况下,库名后面的尾随" "字面只是该公司使用的惯例,而不是一般的行业.

c c++ linux dll linker

255
推荐指数
4
解决办法
15万
查看次数

找到N×N二进制矩阵中仅包含零的最大矩形

给定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.

arrays algorithm

73
推荐指数
4
解决办法
5万
查看次数

OpenCV - 从图像网格拼接图像

我找到了一些关于通过OpenCV缝合全景图像的基本工作示例.我还在API文档中找到了一些有用的文档,但是我无法通过提供其他信息来了解如何加快处理速度.

在我的例子中,我在一个20x20网格的单个帧中生成一组图像,总共400个图像被拼接成一个大的图像.这在现代PC上花费了大量时间,因此在开发板上可能需要数小时.

有没有办法告诉OpenCV实例有关图像的信息,比如我事先知道所有图像在网格上的相对位置?到目前为止,我看到的唯一API调用是将所有图像无差别地添加到队列中vImg.push_back().


参考

  1. 拼接.图像拼接 - OpenCV API文档,访问2014-02-26,<http://docs.opencv.org/modules/stitching/doc/stitching.html>
  2. OpenCV Stitching示例(Stitcher class,Panorama),访问2014-02-26,<http://feelmare.blogspot.ca/2013/11/opencv-stitching-example-stitcher-class.html>
  3. 全景 - OpenCV图像拼接,访问2014-02-26,<http://ramsrigoutham.com/2012/11/22/panorama-image-stitching-in-opencv/>

c c++ opencv image-stitching opencv-stitching

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

bash 脚本的“标准化”文档字符串/自文档

背景

例如,Python 脚本可以通过docstrings. 它的巧妙之处在于,它们可以在每个函数级别、每个方法级别、每个类级别进行定义,最重要的是(在我的问题的上下文中):每个文件级别。例如,文件的顶部可能如下所示:

#!/usr/bin/env python
"""
@brief  A script that does cool stuff.
"""
Run Code Online (Sandbox Code Playgroud)

此功能的特别有用之处在于它可以在运行时轻松提取和打印。


这样做脚本支持这样的功能?即是否有一种“标准化”的方法来生成文件级文档集(即脚本目的、usage语法等的人类可读描述;以便另一个脚本很容易自动解析/提取这些信息?我的目标是创建几个自我记录的调试脚本,如果已经有标准/事实上的最佳方法来做到这一点,我想避免重新发明轮子。

python documentation bash shell scripting

13
推荐指数
3
解决办法
5445
查看次数

VIM作为IDE - 建议

我正在寻找有关使用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插件进行目录浏览等,但我需要对代码完成和符号解析做些什么,因为这是我最关心的两个问题.

  1. 符号解析
    • 我在使用C-tag方面经验有限,如果我正在使用频繁更改的非常大的代码库,我想要一些关于我应该使用的建议.我工作的项目通常是从至少十几个其他项目中提取头文件,我希望能够跳转到快速定义函数,常量或宏的文件(即:像CTRL-G一样) Eclipse中的功能,"跳转到定义"),以及快速获取函数/宏/常量/等所有调用/引用的列表(即:像Eclipse中的CTRL-SHIFT-G功能一样,"显示所有引用在项目或当前工作目录").
  2. 标签完成
    • 例如,我在Visual Studio和Eclipse中非常喜欢的功能之一是当我输入变量名称(即:指向struct的指针)时,它会解析所有结构成员的名称和类型,并为我提供一个选项卡完成列表选择合适的成员.当我错误地使用"."时,他们也会指出.vs" - >"用于成员访问.我在VIM中尝试过superTab,但我无法让它工作.我还希望制表符完成功能使用与符号解析插件生成的相同的C-tag
  3. 处理构建输出
    • 我的最后一个问题是有一个自动生成的构建警告列表和构建错误.例如,当我在命令行提示符下运行"make all"时,必须阅读代码清单以手动查找所有构建警告是一件痛苦的事.

我意识到这有很多要问,而且我总是可以回到Visual Studio或Eclipse,但我真的只想要一个简单的跨平台控制台功能的模态编辑器来满足我的所有开发需求,而且没有一个主要的IDE在那里填补了这个需求.

谢谢大家.

ide vi vim editor macvim

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

我们应该使用多个接受器套接字来接受大量连接吗?

众所周知,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

  1. 此外,内核为SO_REUSEPORT其他操作系统中找不到的套接字执行一些"特殊魔法" :对于UDP套接字,它尝试均匀分布数据报,对于TCP侦听套接字,它会尝试分发传入的连接请求 (通过调用接受的请求accept())均匀地跨越共享相同地址和端口组合的所有套接字.因此,应用程序可以轻松地在多个子进程中打开相同的端口,然后使用它 SO_REUSEPORT来获得非常便宜的负载平衡.

同样众所周知,为了避免自旋锁定和高性能锁定,不应该有超过1个线程的套接字.即每个线程都应该处理自己的套接字以进行读/写.

POSIX.1-2001/SUSv3 需要accept(),bind(),connect(),listen(),socket(),send(),recv()等作为线程安全函数.标准中可能存在关于它们与线程交互的一些含糊之处,但其意图是它们在多线程程序中的行为受标准控制.

  • 如果我们在许多线程中使用相同的一个套接字,那么性能将会很低,因为套接字通过锁进行防御,以便从多个线程进行线程安全访问:https: …

c sockets linux multithreading tcp

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

Vim - 显示数据类型

我通常在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中,但我不知道如何使用它.

谢谢.

c ide vim

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

MSBuild - 如何并行构建多个文件和项目

我有一个.sln包含大量项目(~50)的大型Visual Studio 2010解决方案文件().每个项目都包含粗略20 .cpp.h文件.在快速的Intel i7计算机上构建整个项目大约需要2个小时,所有依赖项都在快速SSD上本地缓存.

我试图复制我在这个主题上发现的现有实验,需要澄清如何:

  1. 获取我想要在Visual Studio中工作的并行化(使用GUI/IDE).
  2. 通过自动命令行构建也可以获得这些更改MSBuild.exe.

首先,/m/maxcpucount选项是一样的吗?我已经阅读了一篇关于该/m选项的文章,该文章似乎并行构建了更多项目.这似乎与我通过GUI中的以下操作设置的选项相同:

  • Tools
    • Options
    • Projects and Solutions
    • Build and Run
      • Maximum number of parallel project builds

还有另一种选择,/MP我可以通过以下方式访问GUI:

  • Projects
    • Properties
    • Configuration Properties
    • C/C++
      • General
      • 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

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

Windows - 通过"localhost"访问数据会导致网络堆栈开销

我有大量的音频文件,我通过处理算法运行,试图从中提取某些数据(即:整个剪辑的平均音量).我有许多构建脚本,以前从Samba网络共享中提取输入数据,我已经创建了一个映射到via net use(即:)的网络驱动器M: ==> \\server\share0.

现在我有一个新的大型1TB SSD,我可以在本地存储文件并快速处理它们.为了避免大量重写我的处理脚本,我删除了网络驱动器映射,并使用localhost主机名重新创建它.即:M: ==> \\localhost\mydata.

当我使用这样的映射时,我是否有可能产生大量开销,例如数据必须通过Windows网络堆栈的一部分,或者操作系统是否使用任何快捷方式,因此它或多或少等于直接磁盘访问(即:机器知道它只是从自己的硬盘驱动器中提取文件).增加的延迟并不是我的担忧,但最大的持续平均吞吐量至关重要.

我问这个是因为我决定是否应该修改所有处理脚本以使用不同的网络路径样式.

额外问题:这同样适用于Linux主机:他们是否足够聪明,知道他们是从本地磁盘中提取的?

windows localhost network-share network-shares

10
推荐指数
1
解决办法
1117
查看次数

带有图形菜单的Bash脚本

我一直在编写简单的bash脚本一段时间,我想知道如何实现简单的菜单,如果可能的话,使用带颜色的菜单.

在过去,我编写了使用ncurses的简单C应用程序,并希望(如果可能)在我的bash脚本中有菜单,用户可以使用向上/向下箭头选择列表中的项目,然后往返一系列是/否/取消提示.

我熟悉在bash中设置彩色文本,所以有一个开始(例如:使用颜色的bash),所以此时唯一的要求就是看看bash是否具备这些功能.我宁愿避免为此在C/C++中编写应用程序,因为我希望能够动态编辑它.

bash shell menu

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