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/文件夹/……/ccb0psoz .O文件是关于,它不是(故意)开始在我的项目中使用。如果我将名称更改为不同但类似的名称,例如njPhaseSpaceX,它将编译并连接良好。但随后我使用"make clean"清理项目,当我试图重新制作时,我再次得到相同的链接错误!(但有不同的/var/……/xxxxxx。o文件)有什么建议吗?欢呼声
更新:更多奇怪的事情:当我在/var/文件夹/…目录查看是哪个文件造成了重复没有这样的文件存在!
更新: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(分析是独立的,我目前正在运行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
文件中#包含它没有什么不同。
如果您包含这样的文件,有时会提示此错误:文件a包含在文件b中;Filb和文件a包含在文件c中。你能试着把"静态"关键字放在前面的类构造函数,给你的问题?
相关文章:
- 无法在 Mac OS X 上链接静态资源库
- 在Mac OS X Mojave上使用AppleClang编译和链接OpenMP
- 标准::字符串::空的未定义符号错误;Mac OS High Sierra 上的 c++ 标准方法链接错误
- Windows OS上的静态链接
- CMAKE OS X CLION.如何链接自定义动态库
- mbed OS 5 项目中链接了哪些文件
- cppunit在Mac OS X上与Clang链接错误
- 在OS X上使用clang编译boost regex时发生链接错误
- 在 Mac OS X 上编译针对 lib lua 链接的动态库会导致"lua: multiple Lua VMs detected"
- 在 OS X 上编译lsd_slam会引发链接错误 ld:找不到 -lGL 的库
- OS X Mavericks 上的 gtest 的链接器错误
- OS X 上的链接器 (ld):如何使用 -wl,--start-group(和 --end-group)
- CGAL:如何成功编译和链接CGAL示例(在Mac OS X 10.9 Mavericks上)
- 升级到Mac OS X 10.9 / Xcode 5.0.1后C++链接错误
- 在 Mac OS X 上链接不同的C++标准库
- CppUnit OS X 10.10的CMake链接器错误
- POCO链接错误,OS X 10.11.2上体系结构x86_64的未定义符号
- Mac OS X 10.9.5上的HealPix C++链接错误
- 'ld: unknown option: -rpath=./libs' - 在 Mac OS 10.7.5 上构建 OpenFramework 插件时出现链接错误
- 编译过程中无法从加速框架中链接BLAS -OS Yosemite 10.0.5