【问题标题】:gcc -c failed although it is linked to the needed librariesgcc -c 失败,尽管它链接到所需的库
【发布时间】:2014-08-14 13:07:16
【问题描述】:

我想为我目前正在编写的程序创建一个Makefile,但在编译时遇到了问题。到目前为止,我只是将源文件包含到 main 中并编译它:

gcc main.c -lcrypto -lssl

我在我的程序中使用 openssl。但是当我读到这不是一个好习惯时,我想编写一个 make 文件并将头文件包含在 main 中。但是我有以下问题:

我想先制作.o 文件:

gcc -lcrypto -lssl -c read_and_send.c

但是对于这个我得到了很多错误(未知类型名称),这些类型是在 OpenSSL 库中定义的。我不知道如何使用我要编写的数学库来解决它:

gcc -lm -c read_and_send.c

我不会吗?

期待收到您的来信。

亲切的问候

绿色

【问题讨论】:

  • 在编译时,您关心的头文件会包含您正在使用的库文件的声明。所以你需要适当的-I... 选项,如果它们不在包含路径中。在链接时(没有-c)然后你使用参考库进行链接。
  • gcc 的-c 选项告诉它不要调用链接器,这意味着-l... 选项没有意义。

标签: c gcc linker makefile libraries


【解决方案1】:

但是对于这个我得到了很多错误(未知的类型名称),这些类型是在 openssl 库中定义的。

您需要在 read_and_send.c 中包含 openssl 标头

您应该阅读有关 C 编程以及如何使用标头以及如何编译和链接的基本教程。

我不知道如何使用我要编写的数学库来解决它:

gcc -lm -c read_and_send.c

我不会吗?

不,-c 选项意味着您只想将源代码编译成 .o 文件,而不是链接,因此不使用库,并且任何 -l 选项都将被忽略。

当您将所有.o 文件链接在一起以创建可执行文件时,您需要使用-l 选项。当您执行该链接步骤时,库应位于命令的end,在依赖它们的文件之后。

【讨论】:

  • 您好,感谢您的回复。我还有一个问题,如果你也能回答这个问题就好了。我见过一些程序,它们只是在主文件中包含源文件,这似乎更容易,为什么不应该使用这种方法?
  • @user3852496 将源文件分开意味着如果有更改,您只需重新编译该源文件,而不是重新编译所有内容。一个极端的例子是 Linux 内核。内核编译有时可能需要超过 20-30 分钟,甚至可能需要几个小时。如果您尝试对一个文件进行增量更改,则必须非常为该更改重新编译整个内核
  • 在其他源文件中包含源文件是令人厌恶和不好的做法。它违反了语言的设计原则,例如假设声明为static 的变量或函数在其他源文件中不可见,并且也很懒惰和丑陋。
猜你喜欢
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
相关资源
最近更新 更多