Ciao a tutti. Sto diventando matto.
quando linko il mio programma ottengo il seguente errore:
g++ -o BendersGMLP benders.o main.o masterGMLP.o subProblem.o subSubProblem.o -O4 -ggdb -DIL_STD -Wall -msse2 -mfpmath=sse -UGENERA_GRAFICI -USAVECUT -UPRINT_LP -USAVEMODELS -USTAMPE -U_BASIC_BENDERS -URELAXATION -UONEMASTER -UDEBUG -UNDEBUG -I. -I/home/cplex/10.1.1/include -I/home/cplex/10.1.1/include -Iinclude -I/home/errico/TSP/concorde/libs -I/home/errico/gmlputils/include -I/home/errico/gmlplibs/include -L/home/cplex/10.1.1/x86_64-unknown-linux-gnu/lib/ -lilocplex -lcplex -L/home/cplex/10.1.1/x86_64-unknown-linux-gnu/lib/ -lconcert -lm -lpthread -L/home/errico/gmlputils/ -lGMLPutils -L/home/errico/TSP/concorde/libs -lconcorde -L/home/errico/gmlplibs -lTSP_SP
/home/errico/gmlplibs/libTSP_SP.a(mincutConcorde.o)(.text+0x26): In function `minCutConcorde::solveMin()':
source//mincutConcorde.C:38: undefined reference to `CCcut_mincut'
/home/errico/gmlplibs/libTSP_SP.a(mincutConcorde.o)(.text+0x573): In function `minCutConcorde::~minCutConcorde()':
source//mincutConcorde.C:89: undefined reference to `CCutil_freerus'
/home/errico/gmlplibs/libTSP_SP.a(mincutConcorde.o)(.text+0x683): In function `minCutConcorde::~minCutConcorde()':
source//mincutConcorde.C:89: undefined reference to `CCutil_freerus'
collect2: ld returned 1 exit status
Ora, queste funzioni sono nella libreria C chiamata libconcorde.a e sono utilizzate in una coppia di file chiamati mincutConcorde.C-.h
ecco mincutConcorde.h
#ifndef MINCUTCONCORDE
#define MINCUTCONCORDE
#include <iostream>
#include <limits>
#include <vector>
//#include <cut.h>
//#include <concorde.h>
#include "indexes.h"
#define CUTFILE "cut_file"
extern "C"
{
#include "concorde.h"
}
using namespace std;
class minCutConcorde{
public:
___minCutConcorde(double * weights, int nnodes);
___~minCutConcorde();
___void solveMin();
___double getCutVal();
___int * getCut();
___int getCutDim();
private:
........
};
questi due file sono anche loro compilati a parte nella libreria libTSP_SP.a
quando vado a likare tutto, il compilatore mi da il problema di cui sopra.
ecco infine il make (del programma che fallisce):
-------------------------------------------------------------------------------------------------------
PROGRAM = BendersGMLP
all : $(PROGRAM) lib
CPLEXDIR = /home/cplex/10.1.1
CONCERTDIR = /home/cplex/10.1.1
HEADERDIR = include
SOURCEDIR = source
CONCERTINCDIR = $(CONCERTDIR)/include
CPLEXINCDIR = $(CPLEXDIR)/include
CONCERTLIBDIR = $(CONCERTDIR)/$(CONFIG_GUESS)/lib/
CPLEXLIBDIR = $(CPLEXDIR)/$(CONFIG_GUESS)/lib/
CCLNFLAGS = -L$(CPLEXLIBDIR) -lilocplex -lcplex -L$(CONCERTLIBDIR) -lconcert \
-lm -lpthread -L$(HOME)/gmlputils/ -lGMLPutils \
-L$(HOME)/TSP/concorde/libs -lconcorde \
-L$(HOME)/gmlplibs -lTSP_SP
INCPATH = -I. -I$(CPLEXINCDIR) -I$(CONCERTINCDIR) -I$(HEADERDIR) \
-I$(HOME)/TSP/concorde/libs \
-I$(HOME)/gmlputils/include \
-I$(HOME)/gmlplibs/include
CCC = g++
CC = gcc
CFLAGS = -O4 -ggdb -DIL_STD -Wall -msse2 -mfpmath=sse -UGENERA_GRAFICI -USAVECUT -UPRINT_LP -USAVEMODELS \
-USTAMPE -U_BASIC_BENDERS -URELAXATION -UONEMASTER\
-UDEBUG -UNDEBUG
VPATH = source
SOURCES = $(wildcard $(SOURCEDIR)/*)
OBJ = $(SOURCES:.C=.o)
#per l'eseguibile
$(PROGRAM): $(OBJ)
___$(CCC) -o $@ $(^F) $(CFLAGS) $(INCPATH) $(CCLNFLAGS)
# per la libreira
lib: $(OBJ)
___ar ruv lib$(PROGRAM).a *.o
#__rm -f *.o
%.o: %.C
___$(CCC) $(CFLAGS) $(INCPATH) -c $<
NOTE:
-- se copio il mincutConcorde.o generato durante la compilazione della libreria libTSP_SP.a nella directory dove
compilo il programma e se nel make indico esplicitamente la dipendenza da mincutConcorde.o, il linking
avviene in modo corretto (vuol dire almeno che le librerie che gli indico sono giuste)
-- ho fatto un piccolo programma di prova, solo un main che chiama le funzioni incriminate quando
la coppia mincutConcorde e' compilata nella libreria libTSP_SP.a: funziona perfettamte
-- ho provato a compilare sia con gcc che con g++
non so piu' cosa fare... sono disperato.
fausto