簡體   English   中英

在mac os x中鏈接(10.8)

[英]Linking in mac os x (10.8)

我正在嘗試編譯一個多文件的代碼,到目前為止一直工作正常。 但現在我收到了一些鏈接器錯誤。 我有一個類定義'njPhaseSpace',報告為:

     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);
}
}

更新:當類構造函數包含在類定義的主體中時,此問題就消失了。 雖然它很好我可以避免這種情況它並沒有真正幫助,因為現在開發我的課程一切都必須在定義內。

更新:用於編譯的makefile(Analysis是我正在運行的單獨的一個make Explorer -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 $@ $(FLAGS) $(Objects) $(SRCDIR)/CGenerator2jepem.o

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

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

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

$(SRCDIR)/CGenerator2jepem.o:
$(CXX) -c $(@:.o=.cxx) -o $@

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

# 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

問題是類構造函數在頭文件中定義為:

    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文件中創建#including它沒有什么不同。

如果您包含如下文件,有時會提示此錯誤:文件a包含在文件b中; Filb和文件包含在文件c中。 您是否可以嘗試將“static”關鍵字放在類構造函數前面,這會給您帶來問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM