2013-04-09 177 views
0

我试图将在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 
+0

尝试按顺序链接:'[OBJS] -o demo -L。 [LIBS]';另外,不要将'-lcore'添加到Orbit对象编译规则中。 – 2013-04-09 18:01:36

+0

我试过了: $(CC)$(INCLUDE)$(CFLAGS)main.o -o demo -L。 -lcore -lorbit -lm。虽然同样的错误。 – jhc 2013-04-09 18:06:33

+0

也可能需要'main.o ./liborbit.a ./libcore.a -o demo'命令。在最后的手段:'main.o -Wl, - 开始组./liborbit.a ./libcore.a -Wl, - 结束组-o演示' – 2013-04-09 18:07:48

回答

2

如果orbit使用core,然后-lorbitMUST-lcore来之前

如果core也使用orbit(循环依赖),那么你需要做一些像-lorbit -lcore -lorbit(列出其中一个两次)。

阐释:

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

如果它通过链接线上的所有库,仍然有未解决的符号,则链接失败。

因此,您需要订购库,以便不依赖于其他任何内容的最基本库位于末尾g++前端将在最后自动添加C运行时库-lc - 显然,这是最基本的库。除了基础库之外的其他库都是在这些库之前出现的。等等

+0

非常好。不过我完全期待着相反的情况!非常令人惊讶。 – jhc 2013-04-09 18:11:15

+0

阅读编辑后的文章,很好的解释。 – jhc 2013-04-09 18:33:15