C “中错误处理函数的未定义引用”;“Linux编程接口”;

C “中错误处理函数的未定义引用”;“Linux编程接口”;,c,gcc,C,Gcc,我试着运行《Linux编程接口》一书中的一个示例程序。我将所有用户定义的头文件和函数从书的官方网站复制到我的booklib位置。 当我编译程序时,我接受了这些错误。我需要关于“对[functions\u name]的未定义引用**的帮助 代码: gcc-v输出: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/6/lto-wrapper Target: x86_64-l

我试着运行《Linux编程接口》一书中的一个示例程序。我将所有用户定义的头文件和函数从书的官方网站复制到我的booklib位置。 当我编译程序时,我接受了这些错误。我需要关于“对[functions\u name]的未定义引用**的帮助
代码:

gcc-v输出:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-6' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 6.3.0 20170205 (Debian 6.3.0-6)

对于未定义的引用,有人问了一个非常类似的答案


然后,如果这不起作用,我建议您再次尝试,按照指定的下载源文件,您可以查看脚本的makefile,它位于fileio/子文件夹和makefile.inc文件中。

我遇到了完全相同的问题,未定义对其错误处理函数的引用,但是,如果你在自己的目录中做所有事情,我的建议可能没有帮助。如果你从他的网站上下载了压缩的tarball,一切都应该正常。正如它包含的
BUILDING.txt
文件中所述,您所要做的就是从
tlpi dist
tlpi book
目录运行
make
,具体取决于您下载的目录,所有程序都将被编译并准备运行(显然会受到一些操作系统特定问题的影响)。如果要修改程序,只需将保存为该目录的名称添加到该目录的
Makefile
,然后再次运行
make
,就可以开始了。

编译时需要../lib/error\u functions.o文件

gcc -I booklib -o copy copy.c ../lib/error_functions.o
错误函数在lib/error\u functions.c lib/error\u function.h中定义和声明
确保您从tlpi dist运行
Make
,通过它您将有错误函数。o

我在Ubuntu 16.04上遇到了类似的问题。还有MacOSX。 运行“make”时始终会出现包含以下内容的错误:

没有规则使目标“../libtlpi.a”

这为Ubuntu提供了一个简单的解决方案:

sudo apt get安装libcap dev


然后在根目录中运行“make”。

看起来您错误定义了
main()
-可能是
intmain(intargc,char*argv)
(或者
intmain(intargc,char argv[])
),而不是
intmain(intargc,char**argv)
。根据给定的信息,未定义的函数是不可解的。您已调用函数,但未提供其定义。我们无法知道这些函数是在哪里定义的。它可能是另一个C文件,您应该编译成一个对象文件并与主程序链接;它可能应该在一个你没有链接的图书馆里;可能是其他问题。我们可以看看你的代码吗。如果不查看源代码,就不可能调试任何东西。更具体地说,我想看看main的签名。我怀疑您编写的是int-main(int-argc,char-argv[]),而不是int-main(int-argc,char*argv[])@实际上,我给出了问题中源代码的链接。我没有为我的问题输入代码,因为它会很长。我编辑了这个问题。TLPI的代码似乎在Mac上编译得不太好。至少,它给了我比我现在有时间解决的更多的悲伤。基本上,您需要从编译到库中的TLPI
lib
目录获取代码(可能是
libtlpi.a
libtlpi.so
),在编译器命令行中包括
-I/path/to/tlpi/lib
-L/path/to/tlpi/lib
-ltlpi
。本书前面是否定义了缺少的函数?您可能需要为它们编译(并链接)适当的源代码。特别是,你至少要从第三章开始,我可以用你的答案制作一些程序。然而,要在根目录中进行make,我需要'apt get install libacl1 dev'`
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-6' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 6.3.0 20170205 (Debian 6.3.0-6)
gcc -I booklib -o copy copy.c ../lib/error_functions.o