Пакет CUDD: неопределенная ссылка во время компиляции

Я изучаю пакет CUDD для исследовательских целей. У меня есть один пример кода, из которого я пытался изучить основные функции. Но я получаю ошибку во время компиляции.

Я уже установил пути для заголовка.

#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include "cudd.h"
#include "util.h"

void print_dd(DdManager *gbm, DdNode *dd, int n, int pr)
{
    printf("Ddmanager nodes : %ld \n",Cudd_ReadNodeCount(gbm)); 
    printf("Ddmanager vars : %d \n",Cudd_ReadSize(gbm)); 
    printf("Ddmanager reorderings :%d\n",Cudd_ReadReorderings(gbm));
    printf("DdManager memory % ld",Cudd_ReadMemoryInUse(gbm));
    Cudd_PrintDebug(gbm,dd,n,pr);
}

void write_dd(DdManager *gbm, DdNode *dd, char * filename)
{
   FILE *outfile; 
   outfile=fopen(filename,"w");
   DdNode **ddnodearray=(DdNode **)malloc(sizeof(DdNode*));
   ddnodearray[0]=dd;
   Cudd_DumpDot(gbm,1,ddnodearray,NULL,NULL,outfile);
   free(ddnodearray);
   fclose(outfile);
}

int main(int argc, char *argv[])
{
    DdManager *gbm;
    char filename[30];
    gbm=Cudd_Init(0,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0);
    DdNode *bdd=Cudd_bddNewVar(gbm);
    Cudd_Ref(bdd);
    bdd=Cudd_BddToAdd(gbm,bdd);
    print_dd(gbm,bdd,2,4);
    sprintf(filename,"./bdd/graph.dot");
    write_dd(gbm,bdd,filename);
    Cudd_Quit(gbm);
    return 0;       
}

Я получаю некоторую ошибку во время компиляции.

 gcc -I /home/subhadip/cudd-3.0.0 -I /home/subhadip/cudd-3.0.0/util -I /home/subhadip/cudd-3.0.0/cudd transfer1.c /home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a -o transfer1 
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-cuddAPI.o): In function `Cudd_ExpectedUsedSlots':
/home/subhadip/cudd-3.0.0/cudd/cuddAPI.c:1835: undefined reference to `exp'
/home/subhadip/cudd-3.0.0/cudd/cuddAPI.c:1844: undefined reference to `exp'
/home/subhadip/cudd-3.0.0/cudd/cuddAPI.c:1850: undefined reference to `exp'
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-cuddCache.o): In function `cuddCacheProfile':
/home/subhadip/cudd-3.0.0/cudd/cuddCache.c:816: undefined reference to `exp'
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-cuddUtil.o): In function `Cudd_CountMinterm':
/home/subhadip/cudd-3.0.0/cudd/cuddUtil.c:595: undefined reference to `pow'
/home/subhadip/cudd-3.0.0/cudd/cuddUtil.c:595: undefined reference to `pow'
/home/subhadip/cudd-3.0.0/cudd/cuddUtil.c:595: undefined reference to `pow'
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-cuddUtil.o): In function `Cudd_LdblCountMinterm':
/home/subhadip/cudd-3.0.0/cudd/cuddUtil.c:729: undefined reference to `powl'
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-cuddUtil.o): In function `Cudd_CountMinterm':
/home/subhadip/cudd-3.0.0/cudd/cuddUtil.c:595: undefined reference to `pow'
/home/subhadip/cudd-3.0.0/cudd/cuddUtil.c:595: undefined reference to `pow'
/home/subhadip/cudd-3.0.0/cudd/cuddUtil.c:595: undefined reference to `pow'
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-epd.o): In function `EpdNormalizeDecimal':
/home/subhadip/cudd-3.0.0/epd/epd.c:834: undefined reference to `pow'
/home/subhadip/cudd-3.0.0/epd/epd.c:834: undefined reference to `pow'
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-epd.o):/home/subhadip/cudd-3.0.0/epd/epd.c:452: more undefined references to `pow' follow
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-cuddAnneal.o): In function `siftBackwardProb':
/home/subhadip/cudd-3.0.0/cudd/cuddAnneal.c:671: undefined reference to `exp'
/home/subhadip/cudd-3.0.0/cudd/cuddAnneal.c:671: undefined reference to `exp'
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-cuddAnneal.o): In function `cuddAnnealing':
/home/subhadip/cudd-3.0.0/cudd/cuddAnneal.c:229: undefined reference to `log'
/home/subhadip/cudd-3.0.0/cudd/cuddAnneal.c:229: undefined reference to `log'
/home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a(cudd_libcudd_la-cuddAnneal.o): In function `siftBackwardProb':
/home/subhadip/cudd-3.0.0/cudd/cuddAnneal.c:671: undefined reference to `exp'
collect2: error: ld returned 1 exit status

Я попытался статически связать библиотеки, но возникла проблема. Как я могу это исправить?


person Subhadip    schedule 15.05.2019    source источник
comment
Я подозреваю, что необходимые библиотеки cudd не связаны правильно. Вы связываете их статически или динамически?   -  person Vagish    schedule 15.05.2019
comment
Я подключаю библиотеку во время компиляции, добавляя путь к cudd.h, util.h и файлу конфигурации с помощью gcc. Это источник проблемы? Но я думаю, что библиотеки связаны правильно, потому что, когда я пробовал тривиальную программу отображения Hello World с использованием этих заголовков в программе, она работала правильно.   -  person Subhadip    schedule 15.05.2019
comment
I am linking the library during the compilation by adding the path of cudd.h - нет. В вашей команде нет -lcudd или подобных строк. Вы устанавливаете пути поиска с помощью -I команд. Не связывается. Можете ли вы опубликовать вывод find /home/subhadip/cudd-3.0.0 -name '*.so или аналогичный? Есть ли общие библиотеки внутри cudd-3.0.0? Как вы настроили и скомпилировали библиотеку cudd?   -  person KamilCuk    schedule 15.05.2019
comment
@KamilCuk Я использовал ./configure, make, make check для настройки библиотеки cudd. Я не уверен, что в cudd-3.0.0 есть общая библиотека.   -  person Subhadip    schedule 15.05.2019
comment
Итак, согласно README (надеюсь, вы читали), вы собрали статические библиотеки. Так найди их. Вы ищете файлы с расширением .a, т.е. find /home/subhadip/cudd-3.0.0 -name '*.a', возможно, cudd.a или libcudd.a. (Я думаю, что это, вероятно, в каталоге .libs, но это предположение).   -  person KamilCuk    schedule 15.05.2019
comment
@KamilCuk Я нашел следующее, как вы сказали. /home/subhadip/cudd-3.0.0/cplusplus/.libs/libobj.a /home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a /home/subhadip/cudd-3.0.0/dddmp /.libs/libdddmp.a . Что теперь мне делать, чтобы решить проблему?   -  person Subhadip    schedule 15.05.2019


Ответы (2)


Вы скомпилировали cudd и создали статическую библиотеку. Теперь вам нужно связать с ним:

gcc .. <other options> ... transfer1.c /home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a -o transfer1

Обратите внимание, что порядок файлов имеет значение.

Я могу предположить, что для поддержки C++ вам нужно связать с cplusplus/.libs/libobj.a, а для поддержки dddmp вам нужны символы, экспортированные в dddmp/.libs/libdddmp.a.

person KamilCuk    schedule 15.05.2019
comment
Я использовал `gcc -I /home/subhadip/cudd-3.0.0 -I /home/subhadip/cudd-3.0.0/util -I /home/subhadip/cudd-3.0.0/cudd transfer1.c -I / home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a -o transfer1 ' . Но я получаю ту же ошибку. - person Subhadip; 15.05.2019
comment
Не -I, в моей команде нет файла -I перед .a. Просто относитесь к файлу .a как к исходному файлу. gcc -I /home/subhadip/cudd-3.0.0 -I /home/subhadip/cudd-3.0.0/util -I /home/subhadip/cudd-3.0.0/cudd transfer1.c /home/subhadip/cudd-3.0.0/cudd/.libs/libcudd.a -o transfer1 - person KamilCuk; 15.05.2019
comment
Я пробовал с командой, которую вы упомянули. На этот раз я получаю другой набор ошибок. Поэтому я изменил вопрос и упомянул его там. - person Subhadip; 15.05.2019
comment
Вам нужно подключить математическую библиотеку. Добавьте -lm после файла .a. .../.libs/libcudd.a -lm -o transfer1. log вычисляет логарифм, exp вычисляет значение экспоненциальной функции e-base, а pow возводит число в степень другого числа. Это функции из стандартной математической библиотеки C. - person KamilCuk; 15.05.2019
comment
Он скомпилирован. Но во время работы я получаю ошибку сегментации. Теперь результат: Узлы DdManager: 4 | Варианты DdManager: 1 | Переупорядочение DdManager: 0 | Память DdManager: 10523080: 3 узла 2 листа 2 minterms ID = 0x9bc15 index = 0 T = 1 E = 0 1 1 Ошибка сегментации (дамп ядра) - person Subhadip; 15.05.2019
comment
Ну, ваш код может быть полон ошибок, вы не проверяли возвращаемые значения и тому подобное. Удачи. У меня нет опыта работы с библиотекой CUDD. Вы можете задать другой вопрос, если вы не можете решить свою проблему, возможно, придет кто-то желающий и опытный в CUDD. - person KamilCuk; 15.05.2019
comment
Что ж, проверяя возвращаемое значение, вы имеете в виду, если fopen() возвращает NULL, тогда мы должны завершить работу? - person Subhadip; 15.05.2019
comment
fopen malloc Cudd_Init Cudd_bddNewVar и Cudd_BddToAdd . Все функции, возвращающие значение, которое можно проверить на наличие ошибок. - person KamilCuk; 15.05.2019
comment
Давайте продолжим обсуждение в чате. - person Subhadip; 15.05.2019

После использования вышеуказанного решения, если ошибка все еще сохраняется, для меня я не создал папку с именем «bdd» в правильном месте для строки кода:

sprintf(filename, "./bdd/graph.dot");

Теперь он выполняется для меня.

person Aadil Hoda    schedule 17.12.2019