14

DCMTK に関係するコードがいくつかあります。コマンドラインから g++ を使用すると、正常にビルドして実行できます。これはコードです:

#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;
}

これはビルド コマンドです。

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

KdevelopでビルドするCMakeLists.txtを作りたいです。これは私が現在持っているものです:

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

しかし、ビルドすると、次のエラーが発生します。

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

エラーを修正するのを手伝ってもらえますか? ありがとうございました。

4

1 に答える 1

24

find_library呼び出しによって変数DINIFTI_DCMTK_LIBに3つの個別のライブラリが入力されることを期待しているようです。

これはどのようにfind_library機能するかではありません。後のさまざまな引数NAMESは、単一のライブラリを呼び出すことができるすべてのさまざまな名前を表します。これにより、コマンドがクロスプラットフォームで機能できるようになります。この場合、同じライブラリを異なるプラットフォームで異なるものと呼ぶことができます。

PATHSマイナーな問題は、おそらくここの代わりに使用することを好むべきであるということですHINTS。ドキュメントを作成します。

...HINTSオプション...は、すでに見つかった別のアイテムの場所によって提供されるヒントなど、システムのイントロスペクションによって計算されたパスである必要があります。ハードコードされた推測は、PATHSオプションで指定する必要があります。

私はあなたがもっと次のようなものが欲しいと想像します:

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)
于 2013-03-04T22:20:15.413 に答える