2013-06-05 3 views
0

Я пытаюсь скомпилировать многофакторный бит кода, который до сих пор работал нормально. Но теперь я получаю некоторые ошибки компоновщика. У меня есть определение класса «njPhaseSpace», который, как сообщалось,:Ссылка в mac os x (10.8)

 ld: duplicate symbol njPhaseSpace::njPhaseSpace(int)in Source/Currents.o and 
    /var/folders/p8/0bwv51kn2w5cx4jnsg6xm7340000gn/T//ccb0Psoz.o for architecture x86_64 

Я понятия не имею, что файл /var/folder/.../ccb0Psoz.o о и это разве (намеренно) начинают использоваться в моем проекте. , если я изменю имя на что-то другое - но похожее - например, njPhaseSpaceX, он скомпилирует и свяжет штраф. Но затем я очищаю проект, используя «make clean», и когда я пытаюсь переделать, я снова получаю ту же ошибку ссылки! (но с другим файлом /var/.../XXXXX.o.) Любые предложения? Cheers

UPDATE: Более странные вещи: Когда я смотрю в каталоге/var/folder/..., чтобы увидеть, какой файл вызывает дублирование, такой файл не существует!

UPDATE: Исходный файл njPhaseSpace является:

// Standard header files 
#include <iostream> 
#include <string.h> 
#include <stdlib.h> 
#include <vector> 
#include <stdio.h> 
#include <math.h> 
#include <complex> 
#include <iomanip> 
#include "LoadBar.h" 

// CLHEP header files 
#include <CLHEP/Vector/LorentzVector.h> 
#include <CLHEP/Random/RanluxEngine.h> 

// More convenient label for four-vectors 
typedef CLHEP::HepLorentzVector HLV; 

// Definition of structure to hold the phase-space point 
struct ParticleStruct { 
HLV pa; 
HLV pb; 
HLV pep; 
HLV pem; 
HLV p1; 
HLV p2; 
HLV p3; 
double xa; 
double xb; 
} ; 

// A class for the n-jet phase space 
class njPhaseSpace { 

private: 
// Incoming Particle Momenta 
HLV pa; 
HLV pb; 

// Emitted leptons 
HLV pep; 
HLV pem; 

// Outgoing parton momenta 
std::vector <HLV> OutgoingPartons; 

// Kinematic factors 
double xa; 
double xb; 

public: 
// Constructor for class 
njPhaseSpace(int n); 

// Returns a vector of the outgoing parton momenta 
std::vector <HLV> ReturnOutgoingPartons() { 
    return OutgoingPartons; 
} 

// HLV IncomingForward 



} ; 

// Class constructor - adds n vectors to the Outgoing array 
njPhaseSpace::njPhaseSpace(int n) { 
// Add n final states to the OutgoingPartons vector 
for (int i = 0; i < n; i++) { 
    HLV temp; 
    OutgoingPartons.push_back(temp); 
} 
} 

UPDATE: Эта проблема уходит, когда конструктор класса входит в тело определения класса. В то время как это хорошо, я могу избежать этого, он действительно не помогает, потому что теперь, чтобы развить свой класс, все должно будет сидеть внутри определения.

ОБНОВЛЕНИЕ: Makefile используется для компиляции (анализ является то, что индивидуальный я в настоящее время работает сделать Проводник -j8):

#/bin/bash 

# CXX Compiler 
CXX = g++ 

# Directories For Compilation 
INCDIR = MadGraph 
LIBDIR = MadGraph 
SRCDIR = Source 

# Compilation Flags 
CXXFLAGS = -O3 -lm 
LIBFLAGS = $(shell clhep-config --libs) $(shell fastjet-config --libs) $(shell clhep-config --libs) $(shell root-config --libs) 
INCFLAGS = $(shell clhep-config --include) -I/$(INCDIR) -I$(SRCDIR) -I. $(shell fastjet-config --cxxflags --plugins) $(shell clhep-config --libs) $(shell root-config --cflags) 
FLAGS = $(CXXFLAGS) $(LIBFLAGS) $(INCFLAGS) 

# Object Files 
Objects = $(addprefix $(SRCDIR)/, Currents.o mstwpdf.o LoadBar.o) 
MadObjects = $(addprefix $(LIBDIR)/, HelAmps_sm.o Parameters_sm.o read_slha.o CPPProcess2j.o CPPProcess3j.o) 

# Main targets 
all: Analysis Explorer 

Analysis: $(SRCDIR)/Analysis2jepem.cxx $(Objects) $(SRCDIR)/CGenerator2jepem.o 
$(CXX) $(SRCDIR)/Analysis2jepem.cxx -o [email protected] $(FLAGS) $(Objects) $(SRCDIR)/CGenerator2jepem.o 

Explorer: $(SRCDIR)/qQepemqQ_Explorer.cxx $(Objects) $(MadObjects) $(LIBDIR)/libmodel_sm.a 
$(CXX) $(SRCDIR)/qQepemqQ_Explorer.cxx -o [email protected] $(FLAGS) $(Objects) -lmodel_sm -L$(LIBDIR) 

# Build object files 
$(Objects): 
$(CXX) -c $(@:.o=.cxx) -o [email protected] 

# Build the MG5 object code 
$(MadObjects): 
$(CXX) -c $(@:.o=.cxx) -o [email protected] -I../ 

$(SRCDIR)/CGenerator2jepem.o: 
$(CXX) -c $(@:.o=.cxx) -o [email protected] 

# Build the Standard Model library 
$(LIBDIR)/libmodel_sm.a: $(MadObjects) 
$(AR) cru [email protected] $^ 
ranlib [email protected] 

# Debugging flags 
debug: CXX += -g -Wall -pendantic 
debug: all 

# Create a clean build 
.PHONY: clean 
clean: 
rm -f $(Objects) $(MadObjects) $(LIBDIR)/2j/libmodel_sm.a $(LIBDIR)/3j/libmodel_sm.a $(TARGET) $(SRCDIR)/CGenerator2jepem.o Analysis Explorer 
+0

Показать исходный файл 'njPhaseSpace'. – trojanfoe

+0

См. Выше @trojanfoe – JMzance

+0

Я не вижу 'njPhaseSpace :: njPhaseSpace (int)' в этом файле. – trojanfoe

ответ

2

Проблема заключается в том, что конструктор класса определен в заголовочном файле как:

njPhaseSpace::njPhaseSpace(int n) { 
// Add n final states to the OutgoingPartons vector 
for (int i = 0; i < n; i++) { 
    HLV temp; 
    OutgoingPartons.push_back(temp); 
} 

Либо поставить его в объявлении класса, или в его собственном отдельном файле .cpp, который компилируется и связаны отдельно.

Это не отличается от создания функции non-inline/non-static/non anonymous namespaced в файле .h и #include в нескольких файлах .cpp.

+0

Cheers @Petesh! – JMzance

0

Эта ошибка иногда будет предложено, если вы включите файлы, как это: стандартный файл включены в файле b; Filb и файл, включенный в файл c. Можете ли вы попытаться поставить «статическое» ключевое слово перед конструктором класса, что дает вам проблемы?

+0

Если я запускаю статический класс {...} Я получаю ошибку: Источник/qQepemqQ_Explorer.h: 71: ошибка: класс хранения может быть указан только для объектов и функций. Вы видели последнее обновление о местоположении конструктора классов, имеющего эффект? Спасибо @ edo42 – JMzance

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