【发布时间】:2012-05-04 18:30:55
【问题描述】:
我有几个 .c 文件和一个 .a 目标文件。我应该使用 gcc 的什么命令将它们编译为一个 exe 文件?如果我们使用makefile,它会是什么样子?
【问题讨论】:
我有几个 .c 文件和一个 .a 目标文件。我应该使用 gcc 的什么命令将它们编译为一个 exe 文件?如果我们使用makefile,它会是什么样子?
【问题讨论】:
对于简单的情况,您可能可以这样做:
gcc -o maybe.exe useful.a something.c
非平凡项目的 Makefiles 通常首先调用 gcc 将每个 .c 文件编译为 .o 对象。
gcc -c something.c
然后他们使用 .o 和 .a 文件列表调用链接器(这些天经常使用 gcc 作为它的包装器)以链接到输出可执行文件。
gcc -o maybe.exe useful.a something.o
还请注意,对于大多数已安装的库,通常不会显式指定 .a 文件,而是说 -lhandy 是“尝试在已配置(或使用 -L 指定)中查找名为 libhandy.a 的东西”的缩写) 搜索目录"
【讨论】:
*.a 是静态库而非动态库(Windows 中为*.dll,Linux 中为*.so)
gcc -L<here comes the library path> -l<library name>
例如对于您应该使用的当前路径中有 libname.a 的文件:
gcc *.c -L. -lname -o myprogram.o
来自man(将 man gcc 放入 shell 命令提示符)
您可以混合使用选项和其他参数。在大多数情况下,订单 你用没关系。当您使用多个选项时,顺序确实很重要 同类;例如,如果您多次指定 -L,则 按指定的顺序搜索目录。还有,安置 的 -l 选项很重要。
【讨论】:
gcc -L<here comes the library path> -l<library name> 从 gcc -l <here comes the library path> -l<library name> 更改为。希望这就是你的意思
libname.a,为什么要使用-lname?
-lfoo 表示 libfoo.a 或 libfoo.so。至于gcc为什么要这么做,我也不知道。
.a 文件是一个库,已经编译。您将 .c 文件编译为 .o,然后使用链接器将 .o 与 .a 链接以生成可执行文件。
【讨论】: