2013-12-18 3 views
1

У меня есть набор файлов 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.

ответ

0

T o Определите, правильно ли вы знаете, что делает компилятор PGI, вы можете попробовать запустить его (вручную из командной строки) с помощью strace, возможно, с флагами -ff и -o и посмотреть, какие файлы он создает.

Если вы решите, что это проблема, первое, что вам нужно сделать, это просмотреть документацию PGI и/или спросить на своих форумах поддержки, чтобы узнать, есть ли параметры компилятора, которые вы можете добавить, которые изменят это поведение, или переменные среды, которые вы можете установить.

Если все это не работает, вы находитесь в мире обид. Простым ответом было бы изменить ваши правила make для копирования источника на уникальное имя перед компиляцией, но это уничтожает возможность его отладки (поскольку исходный файл, закодированный отладчиком, будет случайным именем файла). Любые изменения, которые я могу придумать, будут связаны с очень значительными изменениями ваших make-файлов (например, добавление предварительных условий только для заказа к правилам, в которых несколько файлов создаются из одного источника).

Очень жаль, что ваши make-файлы выглядят просто длинными списками явных правил; если вы использовали меньшее количество неявных правил, вместо этого было бы легче исправить make-файлы.

+0

Почему имя файла должно быть «случайным»? Он может состоять из исходного имени файла плюс некоторое представление параметров компиляции. – reinierpost

+0

Я не обязательно имел ввиду _random_, я имею в виду какое-то «другое» имя.Независимо от того, из чего он состоит, это имя, которое компилятор будет использовать для имени исходного файла, и, если вы не сохраните или не воссоздаете те же самые временные имена файлов, или не определите способ заставить отладчик отображать их все, вы не сможете для отладки вашего кода. В любом случае это явно не позволяет «избежать серьезных изменений в make-файле» также ... – MadScientist

0

Для быстрого обхода я создал поддельные зависимости между целями в Makefile. Таким образом, я не могу одновременно скомпилировать один и тот же исходный файл (для разных целей).

Смежные вопросы