C: 使用 'ld' 单独编译和链接组件程序?
C: compiling and linking component programs separately using 'ld'?
我正在尝试理解 extern
和链接。作为一个简单的演示,我编写了两个 C 文件:一个使用函数的主文件和另一个定义函数的文件:
/* main.c */
#include <stdio.h>
extern void print_nos(int, int);
int main(void) {
print_nos(10, 20);
return 0;
}
/* print_nos.c */
#include <stdio.h>
void print_nos(int lower, int higher) {
int i;
for (i = lower; i <= higher; i++)
printf("%d ", i);
printf("\n");
}
我有两个与此相关的问题:
1)
我知道我可以简单地将两个文件作为参数同时传递给 gcc:
gcc -o main main.c print_nos.c
这工作正常,但我想使用 ld
明确地进行链接,所以我做了:
$ gcc -c main.c # produces main.o
$ gcc -c print_nos.c # produces print_nos.o
$ ld -o main main.o print_nos.o -lc
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401050
如您所见,我收到上述警告,当我尝试 运行 输出文件时:
$ ./main
-bash: ./main: No such file or directory
我没有太多的组装经验,所以我不知道从哪里开始解决这个问题 - 任何帮助表示赞赏。
2)
其次,当我删除 extern
说明符并尝试 运行ning gcc -o main.c print_nos.c
时,程序编译得很好。是否需要声明一个函数 extern
?当我查看所有标准包含文件(如 stdlib、stdio 等)时,我看到所有函数都有一个 extern
声明。因此,我应该在我的案例中使用 extern
(在类似于上面的实际代码中)吗?
我不建议直接使用 ld
,除非您知道自己在做什么并且有充分的理由。如果你想单独编译模块(这是个好主意,这样你就可以只重新编译源文件已更改的模块)你可以使用 gcc
来同时进行编译和链接,如下所示:
gcc -c main.c # produces main.o
gcc -c print_nos.c # produces print_nos.o
gcc -o main main.o print_nos.o
至于 extern
说明符,函数不需要它。默认情况下,函数声明是隐式的 extern
。
我正在尝试理解 extern
和链接。作为一个简单的演示,我编写了两个 C 文件:一个使用函数的主文件和另一个定义函数的文件:
/* main.c */
#include <stdio.h>
extern void print_nos(int, int);
int main(void) {
print_nos(10, 20);
return 0;
}
/* print_nos.c */
#include <stdio.h>
void print_nos(int lower, int higher) {
int i;
for (i = lower; i <= higher; i++)
printf("%d ", i);
printf("\n");
}
我有两个与此相关的问题:
1)
我知道我可以简单地将两个文件作为参数同时传递给 gcc:
gcc -o main main.c print_nos.c
这工作正常,但我想使用 ld
明确地进行链接,所以我做了:
$ gcc -c main.c # produces main.o
$ gcc -c print_nos.c # produces print_nos.o
$ ld -o main main.o print_nos.o -lc
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401050
如您所见,我收到上述警告,当我尝试 运行 输出文件时:
$ ./main
-bash: ./main: No such file or directory
我没有太多的组装经验,所以我不知道从哪里开始解决这个问题 - 任何帮助表示赞赏。
2)
其次,当我删除 extern
说明符并尝试 运行ning gcc -o main.c print_nos.c
时,程序编译得很好。是否需要声明一个函数 extern
?当我查看所有标准包含文件(如 stdlib、stdio 等)时,我看到所有函数都有一个 extern
声明。因此,我应该在我的案例中使用 extern
(在类似于上面的实际代码中)吗?
我不建议直接使用 ld
,除非您知道自己在做什么并且有充分的理由。如果你想单独编译模块(这是个好主意,这样你就可以只重新编译源文件已更改的模块)你可以使用 gcc
来同时进行编译和链接,如下所示:
gcc -c main.c # produces main.o
gcc -c print_nos.c # produces print_nos.o
gcc -o main main.o print_nos.o
至于 extern
说明符,函数不需要它。默认情况下,函数声明是隐式的 extern
。