Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alias or command to compile and link all C files

Tags:

c

linux

bash

gcc

I recently started compiling/linking my C files by hand using the gcc command. However it requires all of the source files to be typed at the end of the command. When there are many files to compile/link it can be boring. That's why I had the idea of making a bash alias for the command which would directly type all *.h and *.c files of the folder.

My line in .bashrc is this:

alias compile='ls *.c *.h | gcc -o main'

I found it to work some times but most of the time compile will return this :

gcc: fatal error: no input files

compilation terminated.

I thought that pipe would give the results of ls *.c *.h as arguments to gcc but it doesn't seem to work that way. What am I doing wrong? Is there a better way to achieve the same thing?

Thanks for helping

like image 450
Vincent Pasquier Avatar asked Nov 09 '15 18:11

Vincent Pasquier


People also ask

What is alias command in Linux?

alias command instructs the shell to replace one string with another string while executing the commands. When we often have to use a single big command multiple times, in those cases, we create something called as alias for that command.

Does GCC compile and link?

GCC is capable of preprocessing and compiling several files either into several assembler input files, or into one assembler input file; then each assembler input file produces an object file, and linking combines all the object files (those newly compiled, and those specified as input) into an executable file.


2 Answers

A pipe does not create command line arguments. A pipe feeds standard input.

You need xargs to convert standard input to command line arguments.

But you don't need (or want) xargs or ls or standard input here at all.

If you just want to compile every .c file into your executable then just use:

gcc -o main *.c

(You don't generally need .h files on gcc command lines.)

As Kay points out in the comments the pedantically correct and safer version of the above command is (and I don't intend this in a pejorative fashion):

gcc -o main ./*.c

See Filenames and Pathnames in Shell: How to do it Correctly for an extensive discussion of the various issues here.

That being said you can use any of a number of tools to save you from needing to do this and from needing to rebuild everything when only some things change.

Tools like make or its many clones, "front-ends" (e.g. the autotools, cmake) or replacements (tup, scons, cons, and about a million other tools).

like image 94
Etan Reisner Avatar answered Oct 03 '22 05:10

Etan Reisner


Have you tried using a makefile? It sounds like that might be more efficient for what you're trying to do.

If you really want to do it with BASH aliases, you have to use xargs to get standard input to command line arguments.

like image 34
Cody Swanson Avatar answered Oct 03 '22 04:10

Cody Swanson