2015-02-26 3 views
0

У меня есть проект, который, структура которого определяется следующим образом (ссылка проект here):ошибки Рычажной в проекте

project_source/ 
    CMakeLists.txt 
    .gitignore 
    src/ 
     main.cpp -> main program file 
     windows/ -> contains Unix header implementations for Windows 
      CMakeLists.txt 
      dirent.h 
      getopt.cpp 
      getopt.h 
     classes/ -> custom class directory 
      CMakeLists.txt 
      utlities.cpp 
      utilities.h 
      itk/ -> classes using ITK 
       CMakeLists.txt 
       basicITK.cpp 
       basicITK.h 

Я пытаюсь использовать функцию basic::GetImageInfo() которая объявлена ​​в basicITK. h, но компилятор дает ошибку связи, говоря, что «неопределенная ссылка на GetImageInfo()» как в GCC, так и в MSVC 2012. Я смущен, поскольку, когда я пытаюсь перейти к определению этой функции от main.cpp, используя Visual Studio (нажав F12), он может полностью определить определение (что предполагает отсутствие каких-либо проблем h включить). В том же ключе, когда я вызываю basic::fileExists() от utilities.h, он отлично работает.

Я также попытался создать папку /classes/itk/ напрямую, используя CMakeLists, но даже это не работает. Но, когда я перемещаю basicITK класс под /classes/, он отлично работает. Тем не менее, я бы предпочел сохранить отдельную структуру папок для упрощения будущего расширения.

Любая помощь в этом была бы высоко оценена! Заранее спасибо.

UPDATE:

Для простоты, я удалил ITK зависимости от проекта. Теперь, basic::GetImageInfo() такая же функциональность, как basic::fileExists().

ответ

0

Я исправил проблему, установив ссылку CMake на /classes/itk/ из основных CMakeLists. Если кто-то заинтересован, я сохраню сообщение github project page.

Спасибо @SNC за ответ, но это было не совсем то, что я искал.

1

ld дает «неопределенную ссылку», когда есть объявление функции без реализации. Функция 'GetImageInfo' объявляется в 'basicITK.h', но реализация находится в статической библиотеке (или DLL - если вы используете Windows), которую вы не указали ld для включения во время связывания. Вы должны запустить ld с опцией, которая сообщит ему, чтобы связать внешние библиотеки с вашей программой (например, на некоторых ОС Linux эта опция: -l определено имя библиотеки ', поэтому, если моя программа использует zlib, например, для запуска ld с опцией '-lz').

+0

Спасибо за ответ. Я тоже делаю то же самое для 'basic :: fileExists()', но он очень хорошо связан (но когда я перехожу ** утилиты ** в другую папку под классами /, я получаю такую ​​же жалобу от компилятор. Подумайте, как ваш ответ переводится в CMake (поскольку это то, что я использую для обеспечения поддержки кросс-платформенной)? – scap3y

+0

Возможно, вам стоит посмотреть, правильно ли указаны пути к файлу в инструкциях по сборке CMake. Большинство проблем с предварительной обработкой или связыванием происходят из-за неверные спецификации маршрутов заголовков/библиотек (очевидно, если скрепление не удается при перемещении файла в другое место). Обратите внимание, что иногда в библиотеках отсутствуют функции реализации, в то время как их объявления существуют в заголовках (это обычно происходит, когда появляются новые функции, – SNC

+0

Я выполняю ту же установку как для ** Basic_Classes **, так и для ** ITK_Classes **: 'INSTALL (TARGETS X_Classes DESTINATION lib)' в обоих их файлы CMakeLists. Я предполагаю, что если бы была ошибка с файловыми путями, то функции, определенные в Basic_Classes.lib, не были бы найдены. Поскольку цели установки являются такими обобщенными, я полностью смущен, где ошибка может быть. – scap3y

Смежные вопросы