2013-06-05 154 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/.../XXXXXX.o文件) 有什么建议吗? 干杯

更新:更奇怪的事情:当我在/ var/folder/...目录中查看哪个文件导致重复时,不存在这样的文件!

进展: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:这问题就解决了包含在类定义体内的类构造函数。虽然它的好处我可以避免这一点,但它并不真正有帮助,因为现在为了开发我的课程,所有内容都必须放在定义之内。

UPDATE:用来编译生成文件(分析是独立的东西,我目前正在运行使浏览器-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文件。

这与在.h文件中创建非内联/非静态/非匿名命名空间函数并将其包括在多个.cpp文件中没有区别。

+0

干杯@Petesh! – JMzance

0

此错误有时提示,如果你有这样的文件: 文件包括一在文件b中; 文件中包含的Filb和文件c。 你可以尝试把“静态”关键字放在提供问题的类构造函数前面吗?

+0

如果我运行静态类{...} 我收到错误: Source/qQepemqQ_Explorer。h:71:错误:只能为对象和函数指定存储类。 你有没有看到我最近更新的类构造函数的位置有效?谢谢@ edo42 – JMzance