Странный сценарий получения ошибки g ++ при множественном определении функций

У меня есть код, который уже работает, но нужно перенести его на еще одну платформу Linux. Мне всегда приходится настраивать код на различия gcc / g ++ — обычно данная версия g ++ более ограничена в том, что она позволяет.

В этом случае я получаю ошибку определения нескольких функций в очень простом случае — одна глобальная функция в одном файле cpp вызывается один раз. Я не вижу дубликата списка объектного файла в последней строке ссылки g ++. Дубликатов нет ни в тексте исходного файла (путем поиска), ни в скомпилированном объектном файле (с помощью objdump -t). На самом деле, ошибка подтверждает, что нет истинного дубликата, перечисляя одинаковое смещение в объекте:

ОШИБКА АКТУАЛЬНОЙ ССЫЛКИ:
Simulation1.o: в функции DoSimulation1(int, char**)':
Simulation1.cpp:(.text+0x1800): multiple definition of
DoSimulation1 (int, char **) ‘
Simulation1.o: Simulation1.cpp :(. Text + 0x1800): сначала определено здесь

Обратите внимание на две странные вещи: (1) оригинал и дубликат находятся в .text + 0x1800, и (2) кажется, что он находит дубликат функции, вызываемой внутри функции, но это не рекурсивная функция, и она не позвони сам.

Вот линия связи:

g ++ -O3 -std = c ++ 11 CorrelatePCandFrequency.o CountBroadcasts.o
CheckMemDependencies.o MathModel.o Histograms2.o EvalOddSetCaches2.o
jDEQ.o ChipControl.o jSimplestCache.o WorkingSets.o
EvalOddSetCaches3.o QuickAnal.o Simulation1.o copy.o
ValidateTrailFile.o jCommon.o CountBroadcasts2.o jSimpleCache2.o
BankConflicts.o ParsePTXTrace.o DynamicTrace.o copy.o Simulation1.o
Histograms.o jExcel.o main.o jPreConditionedHintFile.o JVector.o
jBitArray.o Ops.o -o sim

Одиночное определение функции в файле Simulation1.cpp:

bool DoSimulation1(int argc, char* argv[])
{
...
}

Обратите внимание, что когда я выполняю objdump -t на Simulation1.o, а затем на c ++ фильтре, я получаю небольшое изменение:

0000000000001800 г F. Текст 000000000000049b _Z13DoSimulation1iPPc

C ++ Filter _Z13DoSimulation1iPPc
DoSimulation1 (int, char **)

Так что если есть что-то пропущенное, это может быть разница между char ** и char * [])

Опять же, это прекрасно компилируется на других платформах.
Эта ошибка с:
gcc версия 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)

Какие-нибудь мысли? Обычно такие ошибки возникают из-за помещения определения во включаемый файл или из-за странных эффектов перегрузки шаблона. Это довольно просто, и в результате он не будет связывать исполняемый файл.

Спасибо
Джефф

1

Решение

Может быть, потому что у вас есть два Simulation1.o в вашей команде ссылки?

g ++ -O3 -std = c ++ 11 CorrelatePCandFrequency.o CountBroadcasts.o
CheckMemDependencies.o MathModel.o Histograms2.o EvalOddSetCaches2.o
jDEQ.o ChipControl.o jSimplestCache.o WorkingSets.o
EvalOddSetCaches3.o QuickAnal.o Simulation1.o copy.o
ValidateTrailFile.o jCommon.o CountBroadcasts2.o jSimpleCache2.o
BankConflicts.o ParsePTXTrace.o DynamicTrace.o copy.o Simulation1.o
Histograms.o jExcel.o main.o jPreConditionedHintFile.o JVector.o
jBitArray.o Ops.o -o sim

(copy.o, кажется, тоже дублируется)

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector