У меня есть набор файлов C++, которые я компилирую на разных машинах с помощью команды make -j. Проблема возникает только тогда, когда я использую PGI компилятор с параллельными замыкающими, я получаю следующее сообщение об ошибке для некоторых файлов (эта конкретная ошибка файла atprop.cpp):Параллельный make с компилятором pgi
/opt/share/gcc/4.6.0/el6/bin/ld: error in atprop.o(.eh_frame); no .eh_frame_hdr table will be created.
/opt/share/gcc/4.6.0/el6/bin/ld: atprop.o: invalid string offset 615811912 >= 1421 for section `.strtab'
/opt/share/gcc/4.6.0/el6/bin/ld: final link failed: Nonrepresentable section on output
я понял, что эта ошибка для исходных файлов, связанных со многими исполняемыми целями. Например, atprop.cpp скомпилирован три раза с разными макросами (без макросов, -DUBC, -DVBC), которые я использую в коде. Это часть Makefile, что связано с atprop.cpp
$(B)/atprop: $(S)/atprop.cpp $(O)/atlib.o $(O)/atwave.o $(O)/atvecop.o
$(CPPC) $(S)/atprop.cpp $(O)/atlib.o $(O)/atwave.o $(O)/atvecop.o -o [email protected] $(INC) $(FLAGSET2)
$(B)/atprop_ubc: $(S)/atprop.cpp $(O)/atlib.o $(O)/atwave.o $(O)/atvecop.o
$(CPPC) $(S)/atprop.cpp $(O)/atlib.o $(O)/atwave.o $(O)/atvecop.o -o [email protected] $(INC) $(FLAGSET2) -DUBC
$(B)/atprop_vbc: $(S)/atprop.cpp $(O)/atlib.o $(O)/atwave.o $(O)/atvecop.o
$(CPPC) $(S)/atprop.cpp $(O)/atlib.o $(O)/atwave.o $(O)/atvecop.o -o [email protected] $(INC) $(FLAGSET2) -DVBC
переменная $ (CPPC) = КОМП ++, которая равна пути для MPI обертка для компилятора PGI.
$ mpic++ --version
pgcpp 12.10-0 64-bit target on x86-64 Linux -tp bulldozer
Copyright 1989-2000, The Portland Group, Inc. All Rights Reserved.
Copyright 2000-2012, STMicroelectronics, Inc. All Rights Reserved.
Обратите внимание, что компиляция проходит гладко и без проблем, если я использую серийный макияж (т.е. сделать без опции -j).
Я думаю, что это проблема:. PGI компилятор создает временные файлы объекта с таким же именем, как и исходный файл (для примера выше atprop.o Если работать параллельно, компиляция различных макросов будет все писать в тот же файл объекта, который вызывает проблемы, о которых я упоминал выше.
Это происходит только с компилятором PGI. Я не сталкиваюсь с этой проблемой, когда использую компиляторы Intel или gnu. Поэтому мой вопрос заключается в том, что я могу сделать, чтобы облегчить эту проблему с PGI-компилятором? Имейте в виду, что у меня есть много файлов C++ с той же проблемой, и я стараюсь избежать существенной модификации Makefile.
Почему имя файла должно быть «случайным»? Он может состоять из исходного имени файла плюс некоторое представление параметров компиляции. – reinierpost
Я не обязательно имел ввиду _random_, я имею в виду какое-то «другое» имя.Независимо от того, из чего он состоит, это имя, которое компилятор будет использовать для имени исходного файла, и, если вы не сохраните или не воссоздаете те же самые временные имена файлов, или не определите способ заставить отладчик отображать их все, вы не сможете для отладки вашего кода. В любом случае это явно не позволяет «избежать серьезных изменений в make-файле» также ... – MadScientist