2013-03-04 15 views
5

Mam trochę kodu z DCMTK. Mogę z powodzeniem go skompilować i uruchomić, jeśli używam g ++ z wiersza poleceń. Jest to kod:Jak łączyć wiele bibliotek za pomocą 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; 
} 

To polecenie build:

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

chcę zrobić CMakeLists.txt ją zbudować w Kdevelop. To, co obecnie mam:

# 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)    

Ale kiedy go zbudować, ma ten błąd:

/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' 

możesz mi pomóc naprawić ten błąd? Dziękuję Ci.

Odpowiedz

12

Wygląda na to, że oczekujesz wywołania find_library w celu zapełnienia zmiennej DINIFTI_DCMTK_LIB za pomocą 3 oddzielnych bibliotek.

To nie działa jak find_library. Różne argumenty po NAMES reprezentują wszystkie różne nazwy wywoływane przez pojedynczą bibliotekę. Dzięki temu polecenie działa na wielu platformach, gdzie tę samą bibliotekę można nazwać różnymi rzeczami na różnych platformach.

Drobnym problemem jest to, że prawdopodobnie powinieneś używać tutaj PATHS zamiast HINTS. Tworzą dokumenty:

... 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.

Wyobrażam chcesz coś więcej takiego:

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

Dziękuję bardzo. To jest poprawne. – user2039786

+0

Dobre rzeczy. Możesz oznaczyć odpowiedź jako poprawną ;-) – Fraser

+1

Istnieje również moduł wyszukiwania dla DCMTK; być może "find_package (DCMTK REQUIRED)" byłoby pomocne? – Angew

Powiązane problemy