【问题标题】:How to link objects in different directories without makefiles?如何在没有makefile的情况下链接不同目录中的对象?
【发布时间】:2018-11-18 18:39:57
【问题描述】:

我有 3 个目录,srclibinclude。在include 我有头文件header3.h。其代码如下:

//header3.h
extern void change(int *a);

lib 我有文件change4.c,其中包含:

//change4.c
#include <stdlib.h>
#include "header3.h"

void change(int *a){
    int y=100;
    *a=y;
}

src 我有文件manipulate5.c,其中包含:

//manipulate5.c
#include <stdio.h>
#include "header3.h"

int main(void){
     int x=10;
     printf("x is %d\n", x );
     change(&x);
    printf("x is now %d\n", x );
}

我分别为文件manipulate5.cchange4.c 创建了目标文件manipulate5.ochange4.o。当manipulate5.osrcchange4.olib 中时,如何链接两者?

我应该进一步澄清;我应该能够在src 目录中运行可执行文件。因此,我不能在根目录下进行编译。

【问题讨论】:

  • 手动。还有什么?
  • 您需要修复change() — 将整数分配给指针在多个方面是错误的。使用*a = y;(而且空间很便宜——始终使用它们)。
  • 假设当前目录是包含srclib 的目录,那么cc -o program src/manipulate5.o lib/change4.o — 其中cc 是您的C 编译器的名称,当然。如果您尚未创建目标文件,请使用以.c 结尾的名称;显示的代码不会慢很多。
  • 您能告诉我“手动”的含义吗?改变改变不是问题;计算机告诉我 change4.o 根本不存在。
  • Jonathon Leffler:感谢您的回答。它对我的目的来说足够好。

标签: c object-files


【解决方案1】:

看起来您想使用链接器。我假设你在linux上。 ld 是您想要使用的。类似的东西

ld -o executableName lib/change4.o src/manipulate5.o

这是假设您处于项目的顶层。您还必须将标头的两个包含更改为

#include "../include/header3.h"

【讨论】:

  • 更多规则;我不允许在包含语句中使用相对路径。
  • 那么就没有办法为所欲为。这些文件中的任何一个如何知道在哪里可以找到标头?你可以把所有东西都放在同一个目录中。
  • 我一直在做 -I ../include 在我的编译语句中,它似乎工作。 include 包含我的标题。
  • 那么你是用gcc编译的吗?那么你就不需要使用ld了。编译后的 gcc 链接。您需要做的就是将所有 o 文件 gcc 在一起。 gcc lib/change4.o src/manipulate5.o
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2014-07-30
相关资源
最近更新 更多