标签: linux

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

如何在不运行Bash脚本的情况下语法检查?

是否可以检查bash脚本语法而不执行它?

使用Perl,我可以运行perl -c 'script name'.是否有针对bash脚本的等效命令?

unix linux syntax bash gnu

253
推荐指数
5
解决办法
20万
查看次数

在Amazon Cloud Server上设置FTP

我正在尝试在Amazon Cloud Server上设置FTP,但没有运气.我在网上搜索,没有具体步骤如何做到这一点.

我找到了要运行的命令:

$ yum install vsftpd
$ ec2-authorize default -p 20-21
$ ec2-authorize default -p 1024-1048
$ vi /etc/vsftpd/vsftpd.conf
#<em>---Add following lines at the end of file---</em>
    pasv_enable=YES
    pasv_min_port=1024
    pasv_max_port=1048
    pasv_address=<Public IP of your instance>
$ /etc/init.d/vsftpd restart
Run Code Online (Sandbox Code Playgroud)

但我不知道在哪里写.

linux ftp amazon-s3 amazon-ec2 amazon-web-services

253
推荐指数
6
解决办法
26万
查看次数

251
推荐指数
6
解决办法
10万
查看次数

我在哪里可以设置crontab将使用的环境变量?

我每小时都有一个crontab..bash_profile当用户从终端运行作业时,运行它的用户在该工作中具有环境变量,但是,显然这些在运行时不被crontab拾取.

我试着在设置它们.profile.bashrc,但他们似乎仍然没有得到回升.有谁知道我可以把crontab可以拿到的环境变量放在哪里?

unix linux crontab environment-variables

250
推荐指数
12
解决办法
26万
查看次数

使用端口80运行Node.js时的最佳做法(Ubuntu/Linode)

我正在设置我的第一台Node.js服务器cloud Linux node,我对细节很新Linux admin.(顺便说一句,我不是在尝试同时使用Apache.)

一切都安装正确,但我发现,除非我使用root login,我无法听port 80节点.但是出于安全原因,我宁愿不以root身份运行它.

什么是最佳做法:

  1. 为节点设置好的权限/用户以使其安全/沙盒化?
  2. 允许在这些约束内使用端口80.
  3. 启动节点并自动运行它.
  4. 处理发送到控制台的日志信息.
  5. 任何其他一般维护和安全问题.

我应该将端口80流量转发到不同的侦听端口吗?

谢谢

linux security configuration web-applications node.js

250
推荐指数
4
解决办法
14万
查看次数

如何免费使用Inode?

我有一个磁盘驱动器,inode使用率为100%(使用df -i命令).但是,在大幅删除文件后,使用率仍为100%.

这样做的正确方法是什么?

如果磁盘空间使用量较少的磁盘驱动器可能比磁盘空间使用率较高的磁盘驱动器具有更高的Inode使用率,那怎么可能?

如果我压缩很多文件会减少使用的inode数量吗?

unix linux inode memory-management

249
推荐指数
6
解决办法
45万
查看次数

Linux内核是如何测试的?

Linux内核开发人员如何在本地测试代码并在提交代码之后对其进行测试?他们是否使用某种单元测试,构建自动化?测试计划?

linux linux-kernel

248
推荐指数
7
解决办法
6万
查看次数

如何找出给定用户的组?

在Unix/Linux中,如何通过命令行找出给定用户所在的组?

unix linux sysadmin command-line

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

为Python安装tkinter

我想导入Tkinter.但是,我收到一条错误,指出尚未安装Tkinter:

ImportError:没有名为_tkinter的模块,请安装python-tk包

我可以使用synaptic manager安装它(可以吗?),但是,我必须在我编程的每台机器上安装它.是否可以将Tkinter库添加到我的工作区并从那里引用它?

python linux install tkinter

246
推荐指数
13
解决办法
57万
查看次数