C++ 编译错误(g+;+;和make)

C++ 编译错误(g+;+;和make),c++,g++,makefile,C++,G++,Makefile,我曾尝试将一个在VisualStudio 2010 IDE中编译的工作C++库转换成可在任何标准编译器中编译的通用项目。显然,我已经成功地实现了这个目标,因为我已经能够在Ubuntu 12.10下使用Eclipse C++ IDE编译。 此后,我尝试在终端中使用g++和Makefile编译相同的代码。不幸的是,我没有获得同样的成功。虽然我只收到了以下错误,但我似乎离良好的编译非常接近: ./liborbit.a(cOrbit.o): In function `Zeptomoby::OrbitTo

我曾尝试将一个在VisualStudio 2010 IDE中编译的工作C++库转换成可在任何标准编译器中编译的通用项目。显然,我已经成功地实现了这个目标,因为我已经能够在Ubuntu 12.10下使用Eclipse C++ IDE编译。 此后,我尝试在终端中使用g++和Makefile编译相同的代码。不幸的是,我没有获得同样的成功。虽然我只收到了以下错误,但我似乎离良好的编译非常接近:

./liborbit.a(cOrbit.o): In function `Zeptomoby::OrbitTools::cEci::ScalePosVector(double)':
/home/tufts/Programs/workspace/orbitTools/Demo/../core/cEci.h:35: undefined reference to `Zeptomoby::OrbitTools::cVector::Mul(double)'
./liborbit.a(cOrbit.o): In function `Zeptomoby::OrbitTools::cEci::ScaleVelVector(double)':
/home/tufts/Programs/workspace/orbitTools/Demo/../core/cEci.h:36: undefined reference to `Zeptomoby::OrbitTools::cVector::Mul(double)'
./liborbit.a(cNoradBase.o): In function `Zeptomoby::OrbitTools::cNoradBase::FinalPosition(double, double, double, double, double, double, double, double)':
/home/tufts/Programs/workspace/orbitTools/Demo/../orbit/cNoradBase.cpp:265: undefined reference to `Zeptomoby::OrbitTools::cVector::Magnitude() const'
/home/tufts/Programs/workspace/orbitTools/Demo/../orbit/cNoradBase.cpp:285: undefined reference to `Zeptomoby::OrbitTools::cEciTime::cEciTime(Zeptomoby::OrbitTools::cVector const&, Zeptomoby::OrbitTools::cVector const&, Zeptomoby::OrbitTools::cJulian)'
collect2: ld returned 1 exit status
make: *** [compile] Error 1
似乎
orbit
库函数本身使用了
core
库函数

文件系统组织: 注意
生成文件的本地化

生成文件本身是: #编译程序 CC=g++ #包含文件目录 缅因州=$(PWD)/。。 编译=$(MAIND)/编译 核心=$(缅因州)/核心 动态观察=$(缅因州)/动态观察 INCLUDE=-I$(MAIND)-I$(CORE)-I$(ORBIT)-I。 #发展选择 CFLAGS=-g-ansi 编译:main.o libs $(CC)$(INCLUDE)$(CFLAGS)main.o-L-lcore-lorbit-lm-o演示 main.o: $(CC)$(INCLUDE)$(CFLAGS)-c main.cpp #核心库 cEci.o: $(CC)$(包括)$(CFLAGS)-c$(核心)/cEci.cpp 朱利安: $(CC)$(INCLUDE)$(CFLAGS)-c$(CORE)/cJulian.cpp 协调组织: $(CC)$(INCLUDE)$(CFLAGS)-c$(CORE)/coord.cpp cSite.o: $(CC)$(INCLUDE)$(CFLAGS)-c$(CORE)/cSite.cpp 具体行动: $(CC)$(INCLUDE)$(CFLAGS)-c$(CORE)/cTle.cpp cVector.o: $(CC)$(INCLUDE)$(CFLAGS)-c$(CORE)/cVector.cpp globals.o: $(CC)$(INCLUDE)$(CFLAGS)-c$(CORE)/globals.cpp stdafx.o: $(CC)$(INCLUDE)$(CFLAGS)-c$(CORE)/stdafx.cpp 核心:cEci.o cJulian.o coord.o cSite.o cTle.o cVector.o globals.o stdafx.o ar rcs libcore.a cEci.o cJulian.o coord.o cSite.o cTle.o cVector.o globals.o stdafx.o #轨道库 cNoradBase.o: $(CC)$(包括)$(CFLAGS)-c$(轨道)/cNoradBase.cpp-lcore cNoradSDP4.o: $(CC)$(包括)$(CFLAGS)-c$(轨道)/cNoradSDP4.cpp-lcore cNoradSGP4.o: $(CC)$(包括)$(CFLAGS)-c$(轨道)/cNoradSGP4.cpp-lcore cOrbit.o: $(CC)$(INCLUDE)$(CFLAGS)-c$(ORBIT)/cOrbit.cpp-lcore 轨道:cNoradBase.o cNoradSDP4.o cNoradSGP4.o cOrbit.o stdafx.o arrcsliborbit.a cNoradBase.o cNoradSDP4.o cNoradSGP4.o cOrbit.o stdafx.o 核心轨道 清洁: rm*.o 净化: rm*.a
如果
orbit
使用
core
,则
-lorbit
必须位于
-lcore
之前

如果
core
也使用
orbit
(循环依赖),则需要执行类似于
-lorbit-lcore-lorbit
(将其中一个列两次)的操作

说明:

GNU链接器(与大多数UNIX链接器一样)是一个“单通道链接器”。这意味着它从对象文件开始,并记录任何未解析的符号。然后它查看链接线上的第一个库,并拉入可以满足一个或多个未解析符号的任何对象。同时,它将添加它拉入的那些对象引用的任何新的未解析符号。然后它转到链接线上的下一个库。等等

如果它通过了链接线上的所有库,但仍有未解析的符号,则链接失败


因此,您需要对库进行排序,以便最基本的库(不依赖于任何其他内容)位于末尾。
g++
前端将在末尾自动添加
-lc
,即C运行时库——显然这是最基本的库。除了基本库之外,什么都不依赖的库就在这些库之前。等等。

尝试按以下顺序链接:
[OBJS]-o demo-L[LIBS]
;另外,不要将
-lcore
添加到轨道对象编译规则中。我尝试了:$(CC)$(INCLUDE)$(CFLAGS)main.o-o demo-L-lcore-lorbit-lm。但也有同样的错误。可能还需要排序
main.o./liborbit.a./libcore.a-o demo
。万不得已:
main.o-Wl,--start-group./liborbit.a./libcore.a-Wl,--end-group-o-demo
非常好。我完全预料到了相反的结果!非常令人惊讶。
orbitTools/
├── core
│   ├── cEci.cpp
│   ├── cEci.h
│   ├── cJulian.cpp
│   ├── cJulian.h
│   ├── coord.cpp
│   ├── coord.h
│   ├── coreLib.h
│   ├── cSite.cpp
│   ├── cSite.h
│   ├── cTle.cpp
│   ├── cTle.h
│   ├── cVector.cpp
│   ├── cVector.h
│   ├── exceptions.h
│   ├── globals.cpp
│   ├── globals.h
│   ├── stdafx.cpp
│   └── stdafx.h
├── Demo
│   ├── main.cpp
│   └── Makefile
└── orbit
    ├── cNoradBase.cpp
    ├── cNoradBase.h
    ├── cNoradSDP4.cpp
    ├── cNoradSDP4.h
    ├── cNoradSGP4.cpp
    ├── cNoradSGP4.h
    ├── cOrbit.cpp
    ├── cOrbit.h
    ├── stdafx.cpp
    └── stdafx.h
# COMPILER CC = g++ # INCLUDE FILES DIRECTORY MAIND = $(PWD)/.. COMPILE = $(MAIND)/compile CORE = $(MAIND)/core ORBIT = $(MAIND)/orbit INCLUDE = -I$(MAIND) -I$(CORE) -I$(ORBIT) -I. # OPTIONS FOR DEVELOPMENT CFLAGS = -g -ansi compile: main.o libs $(CC) $(INCLUDE) $(CFLAGS) main.o -L. -lcore -lorbit -lm -o demo main.o: $(CC) $(INCLUDE) $(CFLAGS) -c main.cpp # CORE LIBRARY cEci.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(CORE)/cEci.cpp cJulian.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(CORE)/cJulian.cpp coord.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(CORE)/coord.cpp cSite.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(CORE)/cSite.cpp cTle.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(CORE)/cTle.cpp cVector.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(CORE)/cVector.cpp globals.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(CORE)/globals.cpp stdafx.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(CORE)/stdafx.cpp core: cEci.o cJulian.o coord.o cSite.o cTle.o cVector.o globals.o stdafx.o ar rcs libcore.a cEci.o cJulian.o coord.o cSite.o cTle.o cVector.o globals.o stdafx.o # ORBIT LIBRARY cNoradBase.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(ORBIT)/cNoradBase.cpp -lcore cNoradSDP4.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(ORBIT)/cNoradSDP4.cpp -lcore cNoradSGP4.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(ORBIT)/cNoradSGP4.cpp -lcore cOrbit.o: $(CC) $(INCLUDE) $(CFLAGS) -c $(ORBIT)/cOrbit.cpp -lcore orbit: cNoradBase.o cNoradSDP4.o cNoradSGP4.o cOrbit.o stdafx.o ar rcs liborbit.a cNoradBase.o cNoradSDP4.o cNoradSGP4.o cOrbit.o stdafx.o libs: core orbit clean: rm *.o purge: rm *.a