如何使用gcc编译器避免使用-l选项?

时间:2016-10-03 15:29:41

标签: c gcc

我有一个C应用程序,我正在使用默认的gcc编译器在Beaglebone Green Wireless开发系统上进行编译。我的应用程序有以下标题,

 #include <stdio.h>
 #include <unistd.h>
 #include <malloc.h>
 #include <string.h>
 #include <sys/socket.h>
 #include <resolv.h>
 #include <netdb.h>
 #include <openssl/x509.h>
 #include <openssl/ssl.h>
 #include <openssl/err.h>
 #include <assert.h>
 #include <json/json.h>

编译此应用程序时,我必须输入

 gcc edgeclient.c -o edgeclient -l ssl -l crypto -l json

有没有办法可以安装ssl,crypto和json库,所以我不必输入所有这些-l&#39; s?我不是一个懒惰的打字员。只是当我添加一个新库时,我不一定要清楚是否必须添加另一个-l libraryname选项。宁愿清楚地了解发生的事情而不是猜测。

3 个答案:

答案 0 :(得分:0)

这些选项不会安装这些库,而是告诉编译器将程序与这些库链接。我建议你使用一个makefile,你可以通过简单的输入&#34; make&#34;来编写一次以后的编辑选项。 如果您尝试使用尚未在makefile中添加的新库,则可以随时更新makefile。 Cmake是另一种提供可移植性选项的选项。

答案 1 :(得分:0)

  

有没有办法可以安装ssl,crypto和json库,所以我不必输入所有这些-l&#39;

您已经在计算机上安装了它们。否则,它不会编译! 他们在那里告诉链接器链接这些库。因此,如果您在应用程序中使用它们,则需要它们。没有办法避免它们。

  

只是当我添加新库时,我不一定要清楚是否必须添加另一个-l libraryname选项

这很容易找到。如果您的编译失败,那么您缺少一个或多个库! (但编译也可能因其他原因而失败)。

  

宁愿清楚地了解发生了什么而不是猜测。

如果您已经编写了应用程序,那么您很可能知道需要哪些库。看起来您正在编译您不完全理解的代码。 在这种情况下,上面说的&#34;尝试out -lblah并在它失败时添加它&#34;可能是你更容易的选择(也是可靠的方式)。

答案 2 :(得分:0)

  

只是当我添加一个新库时,我不一定要清楚是否必须添加另一个-l libraryname选项。宁愿清楚地了解发生的事情而不是猜测。

首先 ,您需要了解为给定头文件添加#include指令与链接到a之间的区别给出。库是预先编译的外部函数和/或变量的集合,这些函数和/或变量打包在一起,以便您可以在程序中使用它们,而无需使用每个程序从源代码构建它们。头文件(通常)为函数和变量提供声明,也可能为相关的数据类型和宏提供,例如给定库提供的函数和变量。

任何包含对给定函数的调用或对给定变量的访问的源文件都必须事先声明该函数/变量。方便并最小化错误范围是头文件的原因。程序使用的所有函数和变量的实现也必须链接以生成可执行文件。因此,无论何时使用您自己没有提供的实现的函数或变量,您都需要知道两件事:它的声明在哪里(或什么),以及它的实现在哪里。第一个是关于要包含的头文件;后者是关于什么库需要包含在链接中。

请注意,这甚至适用于C标准库。您需要为要使用的每个标准库函数包含适当的头文件。大多数现代编译器会自动将大多数标准库链接到任何程序,但从历史上看,有些需要您明确地链接它,即使在今天,许多编译器要求您显式链接包含数学函数的库,如果您想使用任何一个它们。

第二次 ,您提出了错误的问题,因为您需要链接的库不是(通常)依赖于您包含的头文件。 两者取决于您使用的变量和函数,通过查阅这些函数和变量的文档,可以最好地回答这两个问题。

如果做不到这一点,您可以依靠编译器告诉您未声明的函数,并且您应该可以依赖它来告诉您未声明的变量 - 这可以帮助您确定何时需要包含其他函数头文件。您还应该能够依赖链接器来告诉您没有提供实现的函数和变量 - 这可以帮助您确定何时需要链接其他库。

  

有没有办法可以安装ssl,crypto和json库,所以我不必输入所有这些-l?

技术上,是的。您可以下载源代码,将其与现有源一起构建,并将所有必需的目标文件链接在一起以获取最终的可执行文件。您可能需要递归执行此类源包含。通过这种方式,您可以在不使用任何-l选项的情况下构建程序,代价是需要一个您无法手动输入的构建命令。

这让我了解了构建系统的主题,例如make。用一个。可能直接make本身。这将节省您重复的输入,确保您始终使用所有必需的选项(一旦确定这些选项),并记录您的构建过程和要求。对于像您这样简单的项目,与此类似的Makefile可能就足够了:

LDLIBS = -lssl -lcrypto -ljson

all: edgeclient

Makefile命名为edgeclient.c,并将其放在与make相同的目录中。将其作为工作目录,运行make命令并观察它。有许多方法可以修饰它,并且有一些方法可以修改需要修饰的项目(例如添加更多源文件),但这应该足以让你入门,至少使用GNU {{ 1}}和GNU工具链。