【问题标题】:Compiling header files in ubuntu. What do I type in terminal?在 ubuntu 中编译头文件。我在终端中输入什么?
【发布时间】:2018-03-06 09:48:49
【问题描述】:

我很确定这是一个简单的问题,但我在网上搜索了大约半个小时。

我有 3 个文件:

02_01.c

#include <stdio.h>          // Notice the library included in the header of this file
#include <stdlib.h>

#include "myLibrary.h"      // Notice that myLibrary.h uses different include syntax

#define MAX_LENGTH 21.8
#define WORK_WEEK  5

int main(void) {
    function1();
    return EXIT_SUCCESS;
}

myLibrary.c

void function1(void){
    puts("It works :)");
}

void function2(void){
    //This function does nothing as well
}

myLibrary.h

#ifndef MYLIBRARY_H_
#define MYLIBRARY_H_

void function1(void);
void function2(void);

#endif /* MYLIBRARY_H_ */

首先,我导航到我的工作目录。 通常在没有本地标题的文件中我会输入:

gcc -o 02_01 02_01.c
./02_01

它会起作用的。

我尝试了很多方法,例如:

gcc -o 02_01 02_01.c myLibrary.c

这给了我一个错误“函数'puts'的隐式声明

gcc -o myLibrary myLibrary.c 也会给出同样的错误。

我应该在 ubuntu 的终端中输入什么?

所以我假设 myLibrary.c 中的 puts() 函数没有连接到我包含 stdio.h 的 02_01.c。

【问题讨论】:

  • 您必须包含使用该函数的标头,而不是在另一个 .c 文件中。 gcc 无法在两个文件之间建立链接。你的问题是什么?您不想更改文件的内容?
  • myLibrary.c 中的代码使用在&lt;stdioh.&gt; 中声明的标准 I/O 函数。所以也许你应该在myLibrary.c 中包含那个头文件?头文件只是当前正在编译的translation unit 的一部分,它们不会溢出到其他独立的翻译单元。 (翻译单元基本上是一个单一的源文件及其所有包含的头文件,因此是一个独立的单元。)
  • @Jean-FrançoisFabre 谢谢。这就是我在 C++ 中所做的。我实际上正在学习 Lynda 的视频课程,这些是作为示例提供的文件。他们在 Windows 中使用 Eclipse,所以也许这就是为什么它对他们有用,而不是在 Ubuntu 上对我有用。
  • @Someprogrammerdude 谢谢,我做到了,而且效果很好。
  • 你了解了GNU make,你写了一个很好的Makefile,然后你输入make

标签: c ubuntu gcc terminal


【解决方案1】:

您必须在使用包含函数的每个文件中包含必需的标头。在您的情况下,您必须在 myLibrary.c 文件的开头包含 #include &lt;stdio.h&gt;

另外,您可能想要构建.a 库并稍后链接它。

所以,最后:

  1. 编译库:

         gcc -c -o mylib myLibrary.c
    
  2. 制作静态库:

         ar rcs libMyLib.a mylib
    
  3. 编译应用并链接在一起:

         gcc -o 02_01 02_01.c -L. -lMyLib
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多