刚刚我开始阅读这本书:UNIX® 环境中的高级编程。我想尝试运行它的第一个代码示例。我正在运行 Scientific Linux 6.4。
我下载了源代码,正如它在自述make文件中所说的那样,我在未压缩的文件中运行。
我写了第一个程序(一个模拟ls命令)
#include "./include/apue.h"
#include <dirent.h>
int
main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;
if(argc!=2)
err_quit("usage: test directory_name");
if((dp=opendir(argv[1]))==NULL)
err_sys("Can't open %s", argv[1]);
while((dirp=readdir(dp))!=NULL)
printf("%s\n", dirp->d_name);
closedir(dp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并将其放入未压缩的文件中。正如书中所建议的那样,我接着跑:gcc myls.c. 但我收到此错误:
# gcc myls.c
/tmp/ccWTWS2I.o: In function `main':
test.c:(.text+0x20): undefined reference to `err_quit'
test.c:(.text+0x5b): undefined reference to `err_sys'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我想知道如何解决这个问题。我还希望能够运行我在任何目录中编写的代码。
mak*_*ghi 15
关于如何在 UNIX® 环境中的高级编程中编写和编译程序的简短回顾,感谢slm帮助我理解这些步骤。您可以从这里下载源代码。我希望这些信息包含在本书的附录 b 中,其中解释了头文件。
未压缩的文件包含具有章节名称的目录和另外两个名为include和 的目录lib。具有章节名称的那些包含该章节的所有程序。
该include目录包含本书中大多数程序中使用的头文件:apue.h. 该lib目录具有该标头的实现源代码。
让我们假设未压缩的文件位于:
SCADDRESS/,例如它可能是:
/home/yourid/Downloads/apue.3e/
解压源代码后,进入目录并运行make:
$ cd SCADDRESS
$ make
Run Code Online (Sandbox Code Playgroud)
make将编译所有章节中的所有程序。但重要的是,在此之前,它将创建包含apue.h.
要编译您从书中编写的示例程序,请运行此 GCC 命令(假设您的程序名称是myls.c书中的第一个名称):
gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue
Run Code Online (Sandbox Code Playgroud)
-I告诉在gcc哪个目录中查找包含文件。
-L告诉它库目录的位置,并告诉它
-lapue在该目录中查找的库文件的名称。这样 -LXXX 表示在库目录中查找名为 libXXX.a 或 libXXX.so 的文件。
| 归档时间: |
|
| 查看次数: |
17770 次 |
| 最近记录: |