2014-01-14 5 views
3

Я загрузил источник GDCM 2.4.1 и использовал CMake 2.8.12.1 и Visual Studio 2010 для создания библиотек. Я хочу использовать GDCM в моем проекте на C++. К сожалению, похоже, что после создания GDCM-решения с VS есть только файлы lib в папке bin, но нет типичной папки «include» с файлами заголовков, чего я обычно ожидаю. Таким образом, я не могу интегрировать библиотеки GDCM в свой собственный проект (я пытался использовать FindPackage (GDCM) в своем собственном проекте CMakeproject, но файлы заголовков не могут быть найдены).Использование GDCM через CMake

Я не хочу копировать файлы заголовков вручную или направлять исходный каталог GDCM. Кто-нибудь знает помощь?

+0

Хм, это кажется очень unusal мне. Я много работаю с несколькими C++-библиотеками. Обычно процесс сборки генерирует новую папку «include» и помещает в нее все необходимые файлы заголовков. Ориентация на исходную папку субоптимальна, поскольку вы также нацеливаете файлы без заголовков ... Также это не так, как описано в официальной документации GDCM. Они рекомендуют использовать FindPackage (GDCM), который не работает для меня, потому что файлы заголовков отсутствуют. – MichaelXanadu

+0

У вас не должно быть папки для сборки так же, как исходная папка. И с GDCM (и другими подобными библиотеками на основе CMake) я вообще не собираю проект INSTALL вместо сборки цели ALL_BUILD, и когда я создаю собственное приложение на основе CMake, я установил GDCM_DIR в корневую папку, в которую я построил GDCM. – drescherjm

ответ

2

Я узнал, что проблема имеет какое-то отношение к VTK, я также использую эту библиотеку в своем проекте. Поэтому мне нужно включить «GDCM_USE_VTK» в CMake GDCM. Эта опция приводит к ошибке компилятора, когда я пытаюсь построить подпроект «INSTALL» в решении GDCM:

Ошибка CMake в cmake_install.cmake: 31 (FILE): файл INSTALL не может найти «D:/Libs/VTK_5. 6,0/BIN/бен/vtkCommon.dll».

Я заглянул в каталог VTK и узнал, что путь, упомянутый выше, не существует. Вместо длл находится в:

D: \ Libs \ VTK_5.6.0 \ BIN \ Bin \ Release \ vtkCommon.dll или D: \ Libs \ VTK_5.6.0 \ BIN \ Bin \ Debug \ vtkCommon.dll

Это означает, что решение GDCM не знает, что dll находится в специальной папке для отладки или выпуска. Если отключить «GDCM_USE_VTK», все будет хорошо работать, и все файлы будут скопированы в целевую папку. Но мне нужна DLL VTK. Любые мысли?

Майкл

+0

Установка проект должен установить на C: \ Program Files \ VTK, если вы не изменили CMAKE_INSTALL_PREFIX, и у вас есть разрешение на его установку. Хотя я снова буду предупреждать об этом, поскольку с его помощью вы блокируете использование только Debug или Release для всего вашего кода (не для обоих), если вы используете BUILD_SHARED. Причина в том, что вы не можете безопасно использовать кучу Debug и кучу Release в одном приложении. Это приведет к случайным сбоям при распределении или освобождении памяти. – drescherjm

+0

Также почему вы используете текущую версию GDCM с многолетней версией VTK? – drescherjm

+0

Благодарим вас за подсказку. Я не использую BUILD_SHARED, поэтому думаю, что у меня не будет проблем. Я также попытаюсь указать CMAKE_INSTALL_PREFIX VTK. Причиной для старого VTK и нового GDCM является то, что я в настоящее время обновляю свою программу до более новых библиотек, начиная с GDCM. Считаете ли вы, что это может быть проблемой при использовании нового GDCM и старого VTK (временно)? – MichaelXanadu

0

Для тех, кто когда-либо прикасается с той же проблемой, вот окончательное решение. Построить "ALL_BUILD" в растворе GDCM, а затем интегрировать GDCM LIBS в вашем CMakeLists.txt следующим образом:

FIND_PACKAGE(GDCM REQUIRED) 
    IF(GDCM_FOUND) 
     INCLUDE(${GDCM_USE_FILE}) 
     SET(GDCM_LIBRARIES 
      gdcmcharls 
      gdcmCommon 
      gdcmDICT 
      gdcmDSED 
      gdcmexpat 
      gdcmgetopt 
      gdcmIOD 
      gdcmjpeg12 
      gdcmjpeg16 
      gdcmjpeg8 
      gdcmMEXD 
      gdcmMSFF 
      gdcmopenjpeg 
      gdcmzlib 
      socketxx 
      vtkgdcm 
      Rpcrt4) 
    ELSE(GDCM_FOUND) 
     MESSAGE(FATAL_ERROR "Cannot find GDCM, did you set GDCM_DIR?") 
    ENDIF(GDCM_FOUND) 
Смежные вопросы