32

Hi all: quick question: I'm in a situation where it would be useful to generate my C++ executable using only 'gcc' (without g++). Reason for this is that I have to submit the code to an automatic submission server which doesn't recognize the 'g++' (or 'c++', for that matter) command.

In my experiments, while I'm compiling gcc works well. Problem is, when I try to link the generated object files it gets messed up. Now, based on what I understood from the gcc man page (I may be way off, so tell me if I am), g++ is basically gcc, but it links the C++ library.

If this is true, how can I (if possible) explicitly link the C++ library without using the g++ (or c++) command?

EDIT: I'm adding the makefile to better illustrate the problem:

COMPILER = gcc
CFLAGS = -Wall -g -x c++

# MODULE COMPILATION
model: modules/model.h modules/sources/model.cpp
    $(COMPILER) $(CFLAGS) -c modules/sources/model.cpp -o obj/model.o

algorithms: modules/algorithms.h modules/sources/algorithms.cpp
    $(COMPILER) $(CFLAGS) -c modules/sources/algorithms.cpp -o obj/algorithms.o

io: modules/io.h modules/sources/io.cpp
    $(COMPILER) $(CFLAGS) -c modules/sources/io.cpp -o obj/io.o

stopwatch: modules/stopwatch.h modules/sources/stopwatch.cpp
    $(COMPILER) $(CFLAGS) -c modules/sources/stopwatch.cpp -o obj/stopwatch.o

# EXECUTABLE GENERATION
exe: model algorithms io stopwatch
    $(COMPILER) $(CFLAGS) main.cpp obj/model.o obj/algorithms.o obj/io.o obj/stopwatch.o -o bin/process

# DEFAULT TEST CASE
run: exe
    ./bin/process -i data/nasa_small.log -a data/nasa_small.access -s data/nasa_small.stack

# CLEANING ROUTINE
clean:
    rm -f obj/*
Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
Rafael Almeida
  • 10,352
  • 6
  • 45
  • 60

2 Answers2

50

You can link the standard c++ library with the -l flag to gcc:

gcc cplusplus.o -lstdc++ -o myexe
Austin Mullins
  • 7,307
  • 2
  • 33
  • 48
CB Bailey
  • 755,051
  • 104
  • 632
  • 656
  • This works great, I didn't know the name of the library to link it. – Rafael Almeida Jun 16 '09 at 13:49
  • I've been using this technique successfully for years. But I've just upgraded to Ubuntu 11.10 (gcc 4.6.1) and it's stopped working. I'm now getting "undefined reference to `operator new(unsigned long)'" error on several machines. Has this problem come up for anyone else? – mgiuca Dec 27 '11 at 01:46
  • 1
    Oh, never mind. It's because I've been putting -lstdc++ before the o file. Newer versions of GCC seem to require that you put libraries after the o files. – mgiuca Dec 27 '11 at 01:54
  • Does this link to a dynamic library or a static library? I noticed that there are both .so and .a files on my system for stdc++. – Raffi Khatchadourian Feb 26 '13 at 03:01
16

If you run g++ with the "-v" option, it will show what command and options it uses. You should be able to deduce the correct gcc command line from there.

JesperE
  • 63,317
  • 21
  • 138
  • 197