Как связать несколько библиотек с помощью CMake

У меня есть некоторый код для 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

Я хочу сделать CMakeLists.txt, чтобы построить его в Kdevelop. Вот что у меня сейчас есть:

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

Можете ли вы помочь мне исправить ошибку? Спасибо.

6

Решение

Похоже, вы ожидаете 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)
16

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]