2013-03-04 32 views
5

Tôi có một số mã để làm với DCMTK. Tôi có thể xây dựng và chạy nó thành công nếu tôi sử dụng g ++ từ dòng lệnh. Đây là mã:Cách liên kết nhiều thư viện bằng 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; 
} 

Đây là build lệnh:

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

Tôi muốn thực hiện một CMakeLists.txt để xây dựng nó trong Kdevelop. Đây là những gì tôi hiện có:

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

Nhưng khi tôi xây dựng nó, nó có lỗi này:

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

Bạn có thể giúp tôi để sửa lỗi? Cảm ơn bạn.

Trả lời

12

Dường như bạn mong đợi cuộc gọi find_library để điền biến số DINIFTI_DCMTK_LIB với 3 thư viện riêng biệt.

Đây không phải là cách hoạt động của find_library. Các đối số khác nhau sau NAMES thể hiện tất cả các tên khác nhau mà một thư viện đơn lẻ có thể gọi là . Điều này cho phép lệnh hoạt động trên nhiều nền tảng, trong đó cùng một thư viện có thể được gọi là những thứ khác nhau trên các nền tảng khác nhau.

Một vấn đề nhỏ là bạn có thể nên sử dụng PATHS thay vì HINTS tại đây. Hình thành các tài liệu:

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

Tôi tưởng tượng bạn muốn một cái gì đó giống như:

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

Thank you very much. Chính xác là – user2039786

+0

Công cụ hay. Hãy đánh dấu câu trả lời là đúng ;-) – Fraser

+1

Ngoài ra còn có một mô-đun tìm cho DCMTK; có lẽ 'find_package (DCMTK YÊU CẦU)' sẽ được giúp đỡ? – Angew

Các vấn đề liên quan