У меня есть проект, который, структура которого определяется следующим образом (ссылка проект 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()
.
Спасибо за ответ. Я тоже делаю то же самое для 'basic :: fileExists()', но он очень хорошо связан (но когда я перехожу ** утилиты ** в другую папку под классами /, я получаю такую же жалобу от компилятор. Подумайте, как ваш ответ переводится в CMake (поскольку это то, что я использую для обеспечения поддержки кросс-платформенной)? – scap3y
Возможно, вам стоит посмотреть, правильно ли указаны пути к файлу в инструкциях по сборке CMake. Большинство проблем с предварительной обработкой или связыванием происходят из-за неверные спецификации маршрутов заголовков/библиотек (очевидно, если скрепление не удается при перемещении файла в другое место). Обратите внимание, что иногда в библиотеках отсутствуют функции реализации, в то время как их объявления существуют в заголовках (это обычно происходит, когда появляются новые функции, – SNC
Я выполняю ту же установку как для ** Basic_Classes **, так и для ** ITK_Classes **: 'INSTALL (TARGETS X_Classes DESTINATION lib)' в обоих их файлы CMakeLists. Я предполагаю, что если бы была ошибка с файловыми путями, то функции, определенные в Basic_Classes.lib, не были бы найдены. Поскольку цели установки являются такими обобщенными, я полностью смущен, где ошибка может быть. – scap3y