On a MAC I can successfully compile a c++ program from the command line using
g++ *.cpp *.h -o executablename
However it fails from within Sublime 2 - I created a build system for this using
{
"cmd" : ["g++", "*.cpp", "*.h", "-o", "executablename"]
}
With these results
i686-apple-darwin11-llvm-g++-4.2: *.cpp: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: *.h: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: no input files
[Finished in 0.0s with exit code 1]
However, if I create the build system with specific filenames in the project it works:
{
"cmd" : ["g++", "Test.cpp", "TestCode.cpp", "TestCode.h", "TestCode2.cpp", "TestCode2.h", "-o", "executablename"]
}
How can I create a build system in Sublime 2 that uses command line patterns to compile multiple files like I can on the command line?
Thanks hyde.
After playing with the build system based on your suggestion, this works:
{
"cmd" : ["g++ *.cpp -o executablename"],
"shell":true
}
You should perhaps use something like this:
{
"cmd" : ["gmake"]
}
Or possibly just make
instead of gmake
. But if you have gcc
, GNU make should be in same directory. Below example Makefile is tested with GNU Make, it might not work without small modifications elsewhere.
So here's a very primitive Makefile for you. Important! It should be named Makefile
so GNU Make will find it without arguments, and in it you must use actual tab char for indentation (before g++ and rm command below).
CXXFLAGS := -Wall -Wextra $(CXXFLAGS) # example of setting compilation flags
# first rule is default rule, commonly called 'all'
# if there many executables, you could list them all
all: executablename
# we take advantage of predefined "magic" rule to create .o files from .cpp
# a rule for linking .o files to executable, using g++ to get C++ libs right
executablename: TestCode.o TestCode2.o Test.o
g++ $^ -o $@
# $^ means all dependencies (the .o files in above rule)
# $@ means the target (executablename in above rule)
# rule to delete generated files, - at start means error is ignored
clean:
-rm executablename *.o
But even using hand-written Makefile can be considered primitive these days. You should perhaps install and learn to use CMake.