如何 link 主要使用制作的库?
How to link main with made libraries?
我正在尝试 link 我为主要源代码创建的库,但它抛出了这个错误。过去两个小时我一直在寻找如何解决这个问题,但对我没有任何帮助。
正在编译:
cd "c:\Users\miros\OneDrive\Documents\C codes\labovi"
gcc 01main.c -o 01main
.main
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): undefined reference to '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: error: ld returned 1 exit status
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;
}
您仅将 main.c 编译到可执行文件中,因此其他函数不可用。
您需要将每个源文件编译成一个目标文件,然后link将这些目标文件放在一起。
gcc -c main.c
gcc -c 01izracunavanje.c
gcc -c 01ucitavanje.c
gcc -o 01main main.o 01izracunavanje.o 01ucitavanje.o
我要给你一个中线修正,因为你把你的编译放在一个很长的行上。
在这种情况下,您将所有 .c
文件传递给 gcc
。来自
{ gcc 01main.c -o 01main }
我们宁愿写
{ gcc -o 01main 01main.c 01izracunavanje.c 01ucitavanje.c }
由于您实际上并不是在构建分发库,而是在构建一堆源文件,我们只是将它们全部编译在一起。一旦您开始优化,它无论如何都会以这种方式生成更好的代码。
.c
个文件的顺序并不重要,但包含 main
的文件按照传统排在第一位。将 -o
放在第一个 .c
文件之前很重要,现在大多数人仍然这样做。
我正在尝试 link 我为主要源代码创建的库,但它抛出了这个错误。过去两个小时我一直在寻找如何解决这个问题,但对我没有任何帮助。
正在编译:
cd "c:\Users\miros\OneDrive\Documents\C codes\labovi"
gcc 01main.c -o 01main
.main
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): undefined reference to '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: error: ld returned 1 exit status
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;
}
您仅将 main.c 编译到可执行文件中,因此其他函数不可用。
您需要将每个源文件编译成一个目标文件,然后link将这些目标文件放在一起。
gcc -c main.c
gcc -c 01izracunavanje.c
gcc -c 01ucitavanje.c
gcc -o 01main main.o 01izracunavanje.o 01ucitavanje.o
我要给你一个中线修正,因为你把你的编译放在一个很长的行上。
在这种情况下,您将所有 .c
文件传递给 gcc
。来自
{ gcc 01main.c -o 01main }
我们宁愿写
{ gcc -o 01main 01main.c 01izracunavanje.c 01ucitavanje.c }
由于您实际上并不是在构建分发库,而是在构建一堆源文件,我们只是将它们全部编译在一起。一旦您开始优化,它无论如何都会以这种方式生成更好的代码。
.c
个文件的顺序并不重要,但包含 main
的文件按照传统排在第一位。将 -o
放在第一个 .c
文件之前很重要,现在大多数人仍然这样做。