2013-03-04 14 views
5

Ho del codice da fare con DCMTK. Posso creare ed eseguire correttamente se utilizzo g ++ dalla riga di comando. Questo è il codice:Come collegare più librerie usando CMake

#include "dcmtk/config/osconfig.h" 
#include "dcmtk/dcmdata/dctk.h" 

int main() 
{ 
DcmFileFormat fileformat; 
OFCondition status = fileformat.loadFile("test.dcm"); 
if (status.good()) 
{ 
    OFString patientsName; 
    if (fileformat.getDataset()->findAndGetOFString(DCM_PatientsName, patientsName).good()) 
    { 
     cout << "Patient's Name: " << patientsName << endl; 
    } else 
    cerr << "Error: cannot access Patient's Name!" << endl; 
} else 
cerr << "Error: cannot read DICOM file (" << status.text() << ")" << endl; 
return 0; 
} 

Questo è il comando build:

g++ testeapp.cxx -DHAVE_CONFIG_H -I/path_to_dcmtk/include -L/path_to_dcmtk/lib -pthread -ldcmdata -lz -loflog -lofstd -o main 

Voglio fare un CMakeLists.txt per costruirla in KDevelop. Questo è quello che hanno attualmente:

# Configure toplevel directories 
    SET(PREFIX  ${CMAKE_INSTALL_PREFIX} CACHE PATH "Top level.") 
    SET(INCLUDEDIR ${PREFIX}/include  CACHE PATH "Include files.") 
    SET(LIBDIR  ${PREFIX}/lib   CACHE PATH "Libraries.") 
    FIND_PACKAGE (Threads REQUIRED) 
    # Configure DCMTK 
    FIND_PATH(DINIFTI_DCMTK_INCLUDE dcmtk 
       PATHS ${INCLUDEDIR} 
       PATH_SUFFIXES dcmtk 
       DOC "Path to the DCMTK headers.") 
    FIND_LIBRARY(DINIFTI_DCMTK_LIB NAMES dcmdata ofstd oflog 
       HINTS ${LIBDIR} ${LIBDIR}) 
TARGET_LINK_LIBRARIES(dinifti ${DINIFTI_DCMTK_LIB} 
           ${DINIFTI_ZNZ_LIB} 
           ${CMAKE_THREAD_LIBS_INIT} 
           z)    

Ma quando ho costruire esso, ha questo errore:

/usr/local/lib/libdcmdata.a(dcfilefo.o): In function `DcmFileFormat::remove(DcmItem*)': 
dcfilefo.cc:(.text+0x1788): undefined reference to `log4cplus::Logger::forcedLog(int, OFString const&, char const*, int, char const*) const' 

mi potete aiutare per correggere l'errore? Grazie.

risposta

12

Sembra che si aspetti la chiamata find_library per popolare la variabile DINIFTI_DCMTK_LIB con 3 librerie separate.

Questo non è il modo in cui funziona find_library. I diversi argomenti dopo NAMES rappresentano tutti i vari nomi una singola libreria potrebbe essere chiamata. Ciò consente al comando di funzionare su più piattaforme, dove la stessa libreria potrebbe essere chiamata cose diverse su piattaforme diverse.

Un problema minore è che probabilmente dovresti preferire l'utilizzo di PATHS invece di HINTS qui. Formare la documentazione:

... the HINTS option ... should be paths computed by system introspection, such as a hint provided by the location of another item already found. Hard-coded guesses should be specified with the PATHS option.

immagino si desidera qualcosa di più simile a:

find_library(DINIFTI_DCMTK_LIB NAMES dcmdata PATHS ${LIBDIR}) 
find_library(OFSTD_LIB NAMES ofstd PATHS ${LIBDIR}) 
find_library(OFLOG_LIB NAMES oflog PATHS ${LIBDIR}) 
target_link_libraries(dinifti ${DINIFTI_DCMTK_LIB} 
           ${OFLOG_LIB} 
           ${OFSTD_LIB} 
           ${DINIFTI_ZNZ_LIB} 
           ${CMAKE_THREAD_LIBS_INIT} 
           z) 
+0

Grazie mille. È corretto – user2039786

+0

Roba buona. Sentiti libero di contrassegnare la risposta come corretta ;-) – Fraser

+1

C'è anche un modulo di ricerca per DCMTK; forse 'find_package (DCMTK REQUIRED)' sarebbe di aiuto? – Angew