2013-04-09 146 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