2017-03-08 40 views
0

我想運行一個簡單的程序來學習如何使用CUDD包版本3.0.0。我下載了軟件包並安裝了它:(1- ./configure 2- make 3 make check)。CUDD包:問題編譯和生成文件

我創建了下面的程序:

#include <stdio.h> 
    #include "cudd.h" 
    #include "util.h" 

    int main (int argc, char *argv[]) 
    { 
     printf("Its working"); 
     DdManager *gbm; /* Global BDD manager. */ 
     char filename[30]; 
     gbm = Cudd_Init(0,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0); 
     DdNode *bdd = Cudd_bddNewVar(gbm); 
     Cudd_Ref(bdd); 
     Cudd_Quit(gbm); 
     return 0; 
    } 

我想創建一個makefile編譯它,我該怎麼辦呢? 此外,如果我想通過命令行進行編譯,我該如何鏈接它的庫?

+0

可能重複[什麼是未定義的引用/未解析的外部符號錯誤,以及如何解決它?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved- external-symbol-error-and-how-do-i-fix) – Olaf

回答

1

在版本3中,CUDD對其構建系統進行了重大改進,因此用於編譯使用CUDD的程序的較早版本的HOWTO不再適用。

爲了簡化構建過程中,我通常建議建立針對CUDD 靜態 - 這可以讓你不給路徑的​​CUDD庫和/或安裝CUDD圖書館爲「在/ usr運行後編譯的程序/ lib目錄」。

若要做到這一點,首先重新編譯CUDD:

./configure --enable-dddmp --enable-obj --enable-shared --enable-static; make 

這確保了靜態庫建設,與你以後可能會需要CUDD的可選組件一起。

然後,你可以在命令行編譯示例程序如下:

gcc test.c -o testprogram -I /path/to/cudd-3.0.0/cudd -I /path/to/cudd-3.0.0/util -I /path/to/cudd-3.0.0/ -static -L /path/to/cudd-3.0.0/cudd/.libs/ -lcudd -lm 

有編譯針對CUDD的其他方式,但我個人不是全局安裝庫的忠實粉絲。如果您開始使用CUDD的更多功能,則可能需要爲編譯器添加更多包含目錄以查找CUDD .h文件,並且可能需要更多庫。請注意,以「-static」開頭的所有參數都是上述編譯命令中的鏈接器參數,而其他參數則是編譯器 - 這對了解何時開始編寫Makefiles以使編譯過程自動化非常重要。示例Makefile如下所示:

CFLAGS = -I /path/to/cudd-3.0.0/cudd -I /path/to/cudd-3.0.0/util -I /path/to/cudd-3.0.0/ 
LFLAGS = -static -L /path/to/cudd-3.0.0/cudd/.libs/ -lcudd -lm 

default: testprogram 

testprogram: test.o 
    $(CC) test.o -o testprogram $(LFLAGS) 

test.o: test.c 
    $(CC) test.c -c -o test.o $(CFLAGS) 

請查閱有關如何編寫Makefiles或使用替代構建系統的更全面的文檔。請注意,在上面的文件中,「連續四個空格」需要是製表符以使Makefile工作。如果你把它放在與「test.c」相同的目錄下,名字是「Makefile」,那麼運行「make」應該建立這個程序。

+0

非常感謝您的回答。不幸的是我再次出現錯誤:「ld:library找不到-lcrt0.o」,你能幫我解答嗎? – kafka

+1

我試圖刪除「-static」,它似乎工作。 – kafka