Почему моя программа медленнее при компиляции с использованием make файла?

tl; dr: Когда я компилирую свой код в одну сторону, исполняемый файл выполняется быстро. Когда я использую свой файл makefile, он ~ 10 раз медленнее (исполняемая скорость, а не время компиляции).

Когда я компилирую следующий код (который использует пакет Eigen):

#include <eigen dense=""> // For matrix math
#include <iostream>

using namespace std;
using namespace Eigen;

// Loop an infinite number of times, computing dot products.
int main(int argc, char * argv[]) {
 setNbThreads(16);
 initParallel(); // Tell Eigen that we're going to be multithreaded.

 int n = 100;
 VectorXf a(n), b(n);
 for (int counter = 0; true; counter++) {
 a[0] = a.dot(b) / n;
 if ((counter + 1) % 10000000 == 0) {
 cout << counter / 10000000 << endl;
 }
 }
}
</iostream></eigen>

используя строку:

g++ *.cpp -o exe -I ./PathToEigen -std=c++11 -O2 -DNDEBUG -msse2

он работает очень быстро. Если я использую make файл ниже, итоговый исполняемый файл примерно в 10 раз медленнее. Что я делаю не так?

PROGRAM = EXE

INCLUDEDIRS = -I ./PathToEigen
CXXSOURCES = $(wildcard *.cpp)
CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files
CXXFLAGS = -w $(INCLUDEDIRS)
CXX = g++

#
# Default target: the first target is the default target.
# Just type "make -f Makefile.Linux" to build it.
#

all: $(PROGRAM)

#
# Link target: automatically builds its object dependencies before
# executing its link command.
#

$(PROGRAM): $(CXXOBJECTS)
 $(CXX) -o $@ $(CXXOBJECTS) -std=c++11 -O2 -DNDEBUG -msse2

# Clean target: "make -f Makefile.Linux clean" to remove unwanted objects and executables.
#

clean:
 $(RM) -f $(CXXOBJECTS) $(PROGRAM)

#
# Run target: "make -f Makefile.Linux run" to execute the application
# You will need to add $(VARIABLE_NAME) for any command line parameters 
# that you defined earlier in this file.
# 

run:
 ./$(PROGRAM)
1 ответ

Потому что вы не компилируете какие-либо оптимизации. (Там нет -O2 в CXXFLAGS, то -O2 в $(PROGRAM) правило не распространяется только на стадии соединения.)

licensed under cc by-sa 3.0 with attribution.