在某些情况下,是否有任何令人信服的性能原因选择静态链接而不是动态链接?我已经听过或读过以下内容,但我对这个问题的了解不足以保证它的真实性.
1)静态链接和动态链接之间的运行时性能差异通常可以忽略不计.
2)(1)如果使用使用配置文件数据优化程序热路径的配置文件编译器,则不成立,因为使用静态链接,编译器可以优化代码和库代码.通过动态链接,您的代码可以进行优化.如果大部分时间都花在运行库代码上,那么这可能会产生很大的不同.否则,(1)仍然适用.
我知道有很多关于共享和静态库的用例的问题,这个问题与此无关.我问的是存储在磁盘上的文件格式的差异.
为什么问题是,两者之间有什么区别?或者它们是否完全相同,仅在使用方面有所不同?
我认为它们不一样,因为在共享库上运行'nm'需要-D标志.显然,它需要做一些不同的事情.为什么?
它们都是ELF文件吗?
共享库可以包含某些依赖路径的唯一区别是什么?
我想知道nginx中静态模块和动态模块之间有什么区别,哪些更好?将模块构建为静态/动态模块有哪些优点/缺点.
我已经搜索和阅读了一段时间,但仍然无法得到明确的答案:
运行时库和动态库有什么区别?
具体来说,我想了解以下几个方面:
运行时库在构建过程中如何工作?
为什么称为“运行时”?它总是加载到内存中还是什么?
我不明白这两种类型的库之间的区别,很多网站都说它们是同一件事,但在学校我们使用两种不同的命令来创建它们
动态库
$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -ldl
Run Code Online (Sandbox Code Playgroud)
执行:
$ ./main ./libsample.so
Run Code Online (Sandbox Code Playgroud)
共享库
$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -L. -lsample
Run Code Online (Sandbox Code Playgroud)
执行:
$ LD_LIBRARY_PATH=. ./main
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解这两个“代码”之间的区别吗?
我正在 Ubuntu 18.04 上从源代码构建 Python 3.10,遵循多个 Web 链接的说明,主要是 Python 网站 ( https://devguide.python.org/setup ) 和 RealPython ( https://realpython.com/installing-python/ #如何从源代码构建 python)。我将 Python-3.10.0.tgz 提取到/opt/Python3.10. 我有三个问题。
首先,Python 网站说要使用./configure --with-pydebug,而 RealPython 说要使用./configure --enable-optimizations --with-ensurepip=install. 另一位消息人士称要包括--enable-shared和--enable-unicode=ucs4。其中哪一个最好?我应该使用所有这些标志吗?
其次,我目前安装了Python 3.6和Python 3.8。它们安装在/usr. 按照我在网上看到的指示,我正在 /opt/Python3.10 中构建。我假设make altinstall(最后的构建步骤)将负责将构建安装在 下的常用文件夹中/usr,但这还不清楚。./configure --prefix=directory尽管没有任何网络资源提到这样做,但我应该使用吗?
--enable-optimizations最后,安装过程会减慢多少?
这是我第一次从源代码构建 Python,它将有助于澄清这些事情。谢谢你的帮助。
假设我有一些用 C 编写的代码,定义了一些数据结构和一些使用这些结构的函数,所有这些都位于名为 src1 的目录中。假设现在我想分发这段代码。
如果我想在项目中使用src1中的外部代码我该怎么办?我是否应该将 src1 中的代码编译为 .a 存档,然后将该存档包含在我想要使用的其他项目中?
基本上我需要知道的是在项目中使用外部代码的正确约定。
提前致谢。
我正在用C++构建一个演化模拟器,但不是一个"真正的"可运行程序,而是一个其他程序应该的类#include.这个类,叫World,有一些功能,如update(),getInfo()等...
我在这里遇到两个问题.首先,我不知道我应该如何编译该类,以及我应该为哪些文件提供用户程序(#include该类的用户程序).显然,程序应该接收.hpp文件,但还有什么?该类的目标文件World?这意味着我需要用g++ World.o user.o -o user语法编译用户程序,但有没有办法避免这样做(World.o在我的编译命令中提到)?我不需要iostream.o在编译命令中包含相同的方法.
第二个问题是World该类#include是一些其他类,例如Organism,它们必须包含Block该类才能从中继承.如何编译此代码以获取单个World.o文件(如果这是问题1的答案)?
我在虚拟环境中尝试了一切,但一次又一次“没有名为 opencv 的模块”。我检查了site packages文件夹,发现没有cv2文件夹,就像我发现numpy、pip文件夹一样;但有 1 个文件夹名为:
cv2-1.0-py2.7.egg-info
Run Code Online (Sandbox Code Playgroud)
现在我该怎么办?Open CV 3.0 与 python 3.5.1 不兼容,而这个问题却一次又一次地阻碍我使用 python 2.7。请帮忙!!
PS 前面的答案中提到的解决方案都不起作用:/
我有一个软件库,我曾经创建.a文件,以便人们可以安装它们并链接它们: g++ foo.o -L/path/to -llibrary
但是现在我经常遇到只有.so文件可用的第三方库(而不是.a),你只需要在没有-l开关的情况下链接它们,例如g++ foo.o /path/to/liblibrary.so.
这些解决方案之间有什么区别?我是否应该为我的图书馆用户创建.so文件?
我是C编程的新手.我对.so文件一无所知.有什么需要呢?我怎么创建它?如何绑定我的C代码或二进制文件?如果我不制作任何.so文件并直接生成C代码的可执行二进制文件,它的PROS和CONS是什么?需要详细描述它.
我使用Qt 编译了一个最小的代码示例,并注意到链接到其.lib文件添加了我的编译程序链接到其相应.dll文件的要求.
我想为.lib我的其他一个项目创建一个自己,但是想要这样做,而不必.dll为了它必须链接到它.
从这个问题的答案:静态库和共享库之间的区别?
静态库是.a(或Windows .lib)文件.与库相关的所有代码都在此文件中,并在编译时直接链接到程序中.使用静态库的程序从静态库中获取它使用的代码的副本,并使其成为程序的一部分.[Windows也有.lib文件,用于引用.dll文件,但它们的行为方式与第一个相同].
我是否理解有两种类型的.lib文件:
.dll链接).dll用于将对文件的引用添加到已编译的程序中如果这个观察是正确的,那么如何编译.lib其中一种类型呢?
c ×5
c++ ×4
linker ×2
linux ×2
python ×2
class ×1
compilation ×1
conventions ×1
dll ×1
dynamic ×1
elf ×1
gcc ×1
include ×1
installation ×1
nginx ×1
opencv ×1
opencv3.0 ×1
performance ×1
python-2.7 ×1
python-3.x ×1
runtime ×1
static ×1
unix ×1