小编wes*_*man的帖子

共享对象(.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万
查看次数

将 diff 与 Suppress-common-lines 和上下文选项并排结合起来

我们怎样才能得到类似于我们期望的输出diff --side-by-side --suppress-common-lines --context=3


人们可以使用diff --side-by-side --suppress-common-lines file1 file2并排缩小的补丁视图。

或者使用diff --context=3 file1 file2diff --unified=3 file1 file2来显示更改周围的上下文。

但是结合--side-by-sideand --contextor后--unified我们得到错误:

diff:冲突的输出样式选项

unix diff

9
推荐指数
0
解决办法
5892
查看次数

从Lock()内的UI线程调用方法

我有两种方法,MethodA&MethodB.MethodB必须在UI线程上运行.我需要它们一个接一个地运行而不允许MethodC它们运行.

MethodC 当用户点击一个可爱的小按钮时调用.

我做了什么来确保这是Lock围绕代码:

 lock (MyLock)
 {
   MethodA(param1, param2);

   MyDelegate del = new MyDelegate(MethodB);
   if (this.IsHandleCreated) this.Invoke(del);
 }
Run Code Online (Sandbox Code Playgroud)

并为MethodC:

public void MethodC()
 lock (MyLock)
 {
   Do bewildering stuff.....
 }
Run Code Online (Sandbox Code Playgroud)

问题是我卡住了.看起来我的代码陷入了僵局.

当我看到线程时,我看到按钮点击调用的代码被卡住lock (MyLock)MethodC,我的另一个线程似乎陷入了困境this.Invoke(del).

我已经读过从内部调用一个方法是危险的,Lock但是因为我是那个在那里编写代码的人,这似乎发生了,即使只是Thread.Sleep我认为这不是代码让我陷入困境.

为什么Invoked方法会停止工作?它是否可能等待锁定methodC被释放后再返回到它所调用的原始锁定?

c# multithreading locking invoke

4
推荐指数
1
解决办法
2860
查看次数

用于特定文件的差异的Git日志

如何获得日志列表以及每个提交的差异,
即:

commit1  
Author
Date  
Commit message
changes between commit1 and commit2

commit2  
Author
Date
Commit message
changes between commit2 and commit3
...
Run Code Online (Sandbox Code Playgroud)

使用
git log /some/file
提供更改某些/文件的提交列表

即:

commit1  
Author
Date  
Commit message

commit2  
Author
Date
Commit message
...
Run Code Online (Sandbox Code Playgroud)

但是,不会显示每个提交中的更改

使用
git diff hash1..hash2 /some/file
在这两个提交之间给出/ some/file中的更改.
但只在这两个提交之间,而不是通过所有提交改变/ some/file

git git-diff git-log

2
推荐指数
1
解决办法
3411
查看次数

标签 统计

c ×1

c# ×1

c++ ×1

diff ×1

dll ×1

git ×1

git-diff ×1

git-log ×1

invoke ×1

linker ×1

linux ×1

locking ×1

multithreading ×1

unix ×1