jislam
jislam

Reputation: 842

Cannot find -lCommunication collect2: error: ld returned 1 exit status

I do not know gcc and c well. In my /home/pi/Desktop/intern/adis16227_generic directory I have following 5 files.

ADIS16227.c  
ADIS16227.h  
Communication.c  
Communication.h  
main.c

main.c

#include<stdio.h>
#include "Communication.h"  // Communication definitions.

int main() {
    printf("hello!!\n");
    unsigned char status = 0;
    status = SPI_Init(0, 1000000, 1, 1);
    printf("%u", status);
    return 0;
}

Run command:

$ sudo gcc -L /home/pi/Desktop/intern/adis16227_generic main.c -lCommunication

Error:

/usr/bin/ld: cannot find -lCommunication
collect2: error: ld returned 1 exit status

Question:

What I am missing here?

What do I need to run the code?

Upvotes: 4

Views: 14962

Answers (4)

user2371524
user2371524

Reputation:

-l is for libraries, and you never built a library from your Communication.c. The simplest solution is just add Communication.c to your compiler command line.


For larger projects, compile each translation unit separately with the -c switch like this:

gcc -c -Wall -Wextra -pedantic -omain.o main.c
gcc -c -Wall -Wextra -pedantic -oCommunication.o Communication.c

and so on ... (as a suggestion, I added some common warning options here, they help you spot errors)

The resulting .o files are object code. That's already compiled machine code, but with meta-information needed for a linker to link it with other object code into a complete executable.

Then link them all with one command:

gcc -oprogram main.o Communication.o

If you actually want a library from -- say -- Communication.c and ADIS16227.c, you could compile both to object code:

gcc -c -Wall -Wextra -pedantic -oCommunication.o Communication.c
gcc -c -Wall -Wextra -pedantic --oADIS16227.o ADIS16227.c

and then use ar to create a static library from them:

ar rcs libCommunication.a Communication.o ADIS16227.o

Then your initial compiler command would work (with the -lCommunication switch).


Final piece of advice: Never compile as root. This is completely unnecessary. So remove your sudo here.

Upvotes: 3

user1801517
user1801517

Reputation:

You have to compile separatedly files and then compile main with related obj file.

gcc -c Communication.c Communication.h
gcc main.c Communication.o -o main 

Upvotes: 1

jfMR
jfMR

Reputation: 24778

First move into the /home/pi/Desktop/intern/adis16227_generic directory:

cd /home/pi/Desktop/intern/adis16227_generic

Then, compile the source:

gcc ADIS16227.c Communication.c main.c -I .

You can now run your compiled program (called by default a.out):

./a.out

Upvotes: 1

Jean-Fran&#231;ois Fabre
Jean-Fran&#231;ois Fabre

Reputation: 140256

those options:

-L /home/pi/Desktop/intern/adis16227_generic -lCommunication

suggest that the linker should find libCommunication.a (or .so) in the /home/pi/Desktop/intern/adis16227_generic directory.

But there are only sources in this directory. The linker won't build the sources of your "Communication" library for you.

So you could build the library and link with it:

gcc -c ADIS16227.c Communication.c
ar r libCommunication.a ADIS16227.o Communication.o

but maybe the fastest & quickest way to achieve a successful build would be:

sudo gcc -o main *.c

so it compiles all the files of the directory into the executable called main

Of course, it makes compilation times longer, but maybe it's not noticeable.

Upvotes: 1

Related Questions