У меня есть код, который уже работает, но нужно перенести его на еще одну платформу Linux. Мне всегда приходится настраивать код на различия gcc / g ++ — обычно данная версия g ++ более ограничена в том, что она позволяет.
В этом случае я получаю ошибку определения нескольких функций в очень простом случае — одна глобальная функция в одном файле cpp вызывается один раз. Я не вижу дубликата списка объектного файла в последней строке ссылки g ++. Дубликатов нет ни в тексте исходного файла (путем поиска), ни в скомпилированном объектном файле (с помощью objdump -t). На самом деле, ошибка подтверждает, что нет истинного дубликата, перечисляя одинаковое смещение в объекте:
ОШИБКА АКТУАЛЬНОЙ ССЫЛКИ:
Simulation1.o: в функции DoSimulation1(int, char**)':
DoSimulation1 (int, char **) ‘
Simulation1.cpp:(.text+0x1800): multiple definition of
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)
Какие-нибудь мысли? Обычно такие ошибки возникают из-за помещения определения во включаемый файл или из-за странных эффектов перегрузки шаблона. Это довольно просто, и в результате он не будет связывать исполняемый файл.
Спасибо
Джефф
Может быть, потому что у вас есть два 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, кажется, тоже дублируется)
Других решений пока нет …