繁体   English   中英

Linux 编程:编译带有依赖项的代码

[英]Linux programming: Compile code with dependencies

我是 Linux 编程的新手,是从Michael Kerrisk 的 The Linux Programming Interface 中学习的

我必须编译我的第一个具有依赖项的程序。

目录结构:

--linux-programs
  |--seek_io.c
  |--lib
    |--tlpi_hdr.h
    |--error_functions.h
    |--error_functions.c
    |--get_num.h
    |--ename.c.inc

我想编译seek_io.c程序,在lib目录下有依赖项,这样我就可以看到程序是如何工作的。

我尝试了一些东西,对于它们如何在这个stackoverflow 答案之后工作完全一无所知。 我遇到了各种各样的错误,因为我是 Linux 编程的绝对初学者,而不是编程、linux OS 和 C。


试炼:

gcc -I ./lib/ -c ./lib/error_functions.c然后gcc -o seek_io.c ./error_function.o给出错误: /usr/lib/gcc/x86_64-linux-gnu/crt1.o: In function _start: (.text+0x20): undefined reference to main collect2: error: ld returned 1 exit status

运行后,在ls我发现我的seek_io.c没有列出。


基本上这本书的作者对tlpi_hdr.h文件说:

该头文件包括许多示例程序使用的各种其他头文件,定义了布尔数据类型,并定义了用于计算两个数值的最小值和最大值的宏。 使用这个头文件可以让我们的示例程序更短一些。


链接到上述文件的代码:

tlpi_hdr.h

error_functions.h

error_functions.c

get_num.h

get_num.c

seek_io.c

问题在于您的第二个gcc命令,您在其中使用-o文件来指定输出文件存储生成的可执行文件的位置,但将 C 源文件seek_io.c的名称传递给它...

gcc -o seek_io.c ./error_function.o

这意味着链接文件error_function.o并将可执行文件存储在seek_io.c 这将失败,因为没有独立可执行文件所需的main函数,因此您的 C 源文件不会被失败的链接命令覆盖。

您可以通过向-o选项传递正确的输出文件名来轻松解决此问题,在这种情况下(此链接命令)应该是您要创建的可执行文件的名称,例如seek_io

gcc -o seek_io seek_io.c ./error_function.o

(但是如果没有-I ./lib/就会失败,因为seek_io.c包含该目录中的tlpi_hdr.h 。如果将它添加到该命令中,它应该可以工作。)

您还可以决定将编译和链接步骤分为两个单独的步骤(上面的命令都seek_io.c编译成一个目标文件,然后将两个目标文件链接成一个可执行文件):

$ gcc -I ./lib/ -c ./lib/error_functions.c
$ gcc -I ./lib/ -c seek_io.c
$ gcc -o seek_io seek_io.o error_function.o

最后一个挑剔是-I标志指定搜索包含文件的目录,更常见的用法是标志本身和目录名称之间没有空格,因此您最常看到的是-I./lib甚至-Ilib

$ gcc -Ilib -c ./lib/error_functions.c
$ gcc -Ilib -c seek_io.c
$ gcc -o seek_io seek_io.o error_function.o

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM