【问题标题】:How to link main with made libraries?如何将 main 与制作的库链接?
【发布时间】:2021-06-12 21:03:09
【问题描述】:

我正在尝试将我创建的库链接到主要源代码,但它会引发此错误。我一直在寻找过去两个小时如何解决此问题,但对我没有任何帮助。

编译:

cd "c:\Users\miros\OneDrive\Documents\C codes\labovi"
gcc 01main.c -o 01main
.\01main

d:/programs/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users\ miros\AppData\Local\Temp\ccGHtHKg.o:01main.c:(.text+0x46):未定义对“faktorijel”的引用 d:/programs/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users\miros\AppData \Local\Temp\ccGHtHKg.o:01main.c:(.text+0x72): undefined reference to 'suma' collect2.exe:错误:ld 返回 1 个退出状态

01ucitavanje.h

#ifndef UCITAVANJE_H
#define UCITAVANJE_H
#include <stdio.h>
#include <stdlib.h>

long long *niz;
int n;

void ucitavanje();
#endif

01ucitavanje.c

#include "01ucitavanje.h"

void ucitavanje(){
    scanf("%d", &n);
    niz = malloc(sizeof(long long) * n);
    for (int i = 0; i < n; i++)
        scanf("%d", niz + i);
}

01izracunavanje.h

#ifndef IZRACUNAVANJE_H
#define IZRACUNAVANJE_H
#include <stdio.h>

long long faktorijel(int n);
long long suma(long long *niz, int n);

#endif

01izracunavanje.c

#include "01izracunavanje.h"

long long faktorijel(int n){
    long long f;
    for (int i = 2; i <= n; i++)
        f *= i;

    return f;
}

long long suma (long long *niz, int n){
    long long s = niz[0];
    for (int i = 1; i < n; i++)
        s += niz[i];
    return s;    
}

main.c

#include "01izracunavanje.h"
#include "01ucitavanje.h"

int main(){
    ucitavanje();
    for (int i = 0; i < n; i++)
        niz[i] = faktorijel((int)niz[i]);
    printf("%d", suma(niz, n));
    free(niz);
    return 0;    
}

【问题讨论】:

标签: c libraries modularization


【解决方案1】:

您仅将 main.c 编译到可执行文件中,因此其他功能不可用。

您需要将每个源文件编译成一个目标文件,然后将目标文件链接在一起。

gcc -c main.c
gcc -c 01izracunavanje.c
gcc -c 01ucitavanje.c
gcc -o 01main main.o 01izracunavanje.o 01ucitavanje.o

【讨论】:

  • 我按照你说的做了,但是程序仍然没有运行。还有什么事情要做吗?
  • @qu4lizz 定义“不运行”。
  • 我的意思是什么都没发生。
  • @qu4lizz 所以当你编译程序时没有输出?
  • 是的,即使我运行 .exe 文件,什么也没有。
【解决方案2】:

我要给你一个中线更正,因为你把你的编辑放在一条很长的线上。

在这种情况下,您将所有.c 文件传递​​给gcc。来自

{ gcc 01main.c -o 01main }

我们宁愿写

{ gcc -o 01main 01main.c 01izracunavanje.c 01ucitavanje.c }

由于您实际上并没有构建分发库,而是构建了一堆源文件,我们只是将它们全部编译在一起。一旦你开始优化,它就会以这种方式生成更好的代码。

.c 文件的顺序并不重要,但包含main 的文件是传统的第一个。将-o 放在第一个.c 文件之前很重要,大多数人仍然这样做。

【讨论】:

  • 执行此操作后如何运行程序?
  • @qu4lizz:我很困惑。为什么你的.\01main 不正确。
  • 一切正常,我犯了一个小错误。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多