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

时间:2019-01-06 15:06:13

标签: linux linux-kernel gcc c

我是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

我想在 lib 目录中编译具有依赖项的 seek_io.c 程序,以便了解程序的工作原理。

我尝试了几件事,但毫无根据this 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

1 个答案:

答案 0 :(得分:3)

问题出在您的第二个gcc命令上,您在其中使用-o文件指定输出文件将生成的可执行文件存储在哪里,但将C源的名称传递给了该文件。文件seek_io.c代替...

gcc -o seek_io.c ./error_function.o

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

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

seek_io

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

您还可以决定将编译和链接步骤分为两个单独的步骤(上面的命令将 compile tlpi_hdr.h都放入目标文件,然后 link 将两个目标文件转换成可执行文件),

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