c - 在这种情况下计算机如何知道是使用静态链接还是动态链接

标签 c static-linking dynamic-linking

我正在通过Head First C,完成所有的编程示例。第 8 章从静态链接开始。我们使用这四个命令(Cygwin):

gcc -I./includes -c hfcal.c -o hfcal.o
gcc -I./includes -c elliptical.c -o elliptical.o
ar -rcs ./libs/libhfcal.a hfcal.o
gcc  elliptical.o -L./libs -lhfcal -o elliptical

假设我输入正确,它会打印出几行显示椭圆机上燃烧的卡路里。

接下来他们介绍动态链接。这不是书中最清晰的一章,我仍然有点模糊。更糟糕的是,我不确定新代码是否有拼写错误。文本中说代码与以前相同,但省略了斜杠之前的点,甚至在一种情况下省略了包含末尾的 s。我把点放回去,只改变了他们说应该改变的部分。 (我访问了他们的勘误表页面,但没有看到任何相关内容。)这是新代码:

gcc -I./includes -fPIC -c hfcal.c -o hfcal.o //Got a warning, fPIC ignored, as book predicted
gcc -shared hfcal.o -o ./libs/libhfcal.dll
gcc -I./includes -c elliptical.c -o elliptical.o
gcc  elliptical.o -L./libs -lhfcal -o elliptical

请注意,除了被忽略的 -fPIC 和第二行之外,这些命令与第一种情况相同,但顺序略有不同。

在我成功运行 ./elliptical 后,我想知道我实际上是否应该使用不同的目录,也许缺少的点是故意的。我从未 rm'd 存档 .a 文件,它与新的 dll 文件位于同一目录中。编译器如何知道是否使用 libhfcal.a 还是 libhfcal.dll,因为它们都在那里并且我以相同的方式调用它们?是因为订单的原因吗?

有什么好的资源可以让我阅读更清晰的解释,特别是我可以尝试的代码?

最佳答案

我认为缺少点和s是拼写错误。否则,您需要在系统根目录下有一个 includesinclude 目录,其中包含所需的头文件。

这没有多大意义,因为据我所知,本书中其他地方没有具体说明。

但我认为在尝试动态链接时,您应该删除为静态链接情况创建的存档 ./libs/libhfcal.a ,并将第三行更改为:

gcc -shared hfcal.o -o ./libs/libhfcal.dll

至:

gcc -shared hfcal.o -o ./libs/libhfcal.dll.a

关于c - 在这种情况下计算机如何知道是使用静态链接还是动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18932850/

相关文章:

C预处理器: Dynamic#Define Creation

c - 从字节的 char[] 中获取 int

linux - 使 linux 二进制可移植(ELF Statifier)

static-linking - 链接 Free Pascal 程序以包含依赖项

assembly - 为什么要蹦床从PLT跳到GOT而不是直接跳到GOT?

c++ - 寻找使用 AgentX 实现 SNMP 表的示例代码

c - 如何将 dlsym() 的返回值分配给函数类型?

xcode - Swift 共享库获取命令行应用程序的静态链接?

qt - 覆盖 Qt 4.8.1 的 OpenGL 选择

windows - 使用 DEF 文件而不是 LIB 文件链接到 DLL?