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