我正在通过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后,我想知道我是否应该实际上使用不同的目录,并且可能缺少的点是故意的。我从来没有找到存档.a文件,它与新的dll文件位于同一目录中。编译器如何知道是否使用libhfcal.a或libhfcal.dll,因为它们都存在并且我以相同的方式调用它们?这是因为订单吗?
任何好的资源,我可以阅读更明确的解释,特别是我可以尝试的代码吗?
答案 0 :(得分:0)
我认为缺少点和 s 是错别字。否则,您需要在系统根目录中包含包含和包含目录,并且需要使用头文件。
这没有多大意义,因为据我所知,书中的其他地方没有说明。
但我认为在尝试动态链接时,您应该删除为静态链接案例创建的存档 ./libs/libhfcal.a ,并更改第三行:
gcc -shared hfcal.o -o ./libs/libhfcal.dll
为:
gcc -shared hfcal.o -o ./libs/libhfcal.dll.a