我试图将在Visual Studio 2010 IDE中编译的工作C++库转换为可在任何标准编译器中编译的通用项目。由于我已经能够在Ubuntu 12.10下使用Eclipse C++ IDE进行编译,因此我显然在该目标中取得了成功。编译错误(g ++和make)
我已经尝试在终端中使用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
库函数本身。
文件系统组织:
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
注意Makefile
的本地化。
Makefile文件本身是:
# 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
尝试按顺序链接:'[OBJS] -o demo -L。 [LIBS]';另外,不要将'-lcore'添加到Orbit对象编译规则中。 – 2013-04-09 18:01:36
我试过了: $(CC)$(INCLUDE)$(CFLAGS)main.o -o demo -L。 -lcore -lorbit -lm。虽然同样的错误。 – jhc 2013-04-09 18:06:33
也可能需要'main.o ./liborbit.a ./libcore.a -o demo'命令。在最后的手段:'main.o -Wl, - 开始组./liborbit.a ./libcore.a -Wl, - 结束组-o演示' – 2013-04-09 18:07:48