Ошибка cmake os x ar без конкретных членов архива

У меня есть простой проект cmake, который я не могу скомпилировать в OS X 10.8.4. Процесс cmake/make отлично работает в Linux, но в OS X я получаю эту ошибку:

Linking CXX static library libImageFilter.a
ar: no archive members specified
...
make[2]: *** [lib/libImageFilter.a] Error 1
make[1]: *** [lib/CMakeFiles/ImageFilter.dir/all] Error 2
make: *** [all] Error 2

Я использую Eclipse CDT4 Generator Unix MakeFile на обеих платформах. Это похоже на разницу между ar в двух системах. Но я не мог найти много в Google, чтобы помочь мне устранить неполадки.

Вот еще немного информации для вас

источник/CMakeList.txt

make_minimum_required(VERSION 2.8)
project(itkNormals)
FIND_PACKAGE (ITK REQUIRED)
IF( ITK_FOUND )
  include( ${ITK_USE_FILE} )
ENDIF( ITK_FOUND )
add_subdirectory(test)
add_subdirectory(lib)

источник/lib/CMakeList.txt

add_library(DotImageFilter itkDotImageFilter.h)
SET_TARGET_PROPERTIES(DotImageFilter PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(DotImageFilter ${ITK_LIBRARIES})

add_library(ImageFilter itkImageFilter.hxx)
SET_TARGET_PROPERTIES(ImageFilter PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(ImageFilter ${ITK_LIBRARIES})

источник/тест/CMakeLists.txt:

include_directories(${PROJECT_SOURCE_DIR}/lib)

add_executable(itkNormalsMain itkNormals.cxx)
TARGET_LINK_LIBRARIES(itkNormalsMain ${ITK_LIBRARIES})
TARGET_LINK_LIBRARIES(itkNormalsMain ImageFilter)
TARGET_LINK_LIBRARIES(itkNormalsMain DotImageFilter)

add_executable(dotTestMain dotTester.cxx)
TARGET_LINK_LIBRARIES(dotTestMain ${ITK_LIBRARIES})
TARGET_LINK_LIBRARIES(dotTestMain ImageFilter)
TARGET_LINK_LIBRARIES(dotTestMain DotImageFilter)

add_executable(IST ImageSourceTest.cxx)
TARGET_LINK_LIBRARIES(IST ${ITK_LIBRARIES})
TARGET_LINK_LIBRARIES(IST ImageFilter)

person jmerkow    schedule 07.11.2013    source источник


Ответы (1)


Вы не можете создать библиотеку из одного заголовочного файла:

add_library(ImageFilter itkImageFilter.hxx)
SET_TARGET_PROPERTIES(ImageFilter PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(ImageFilter ${ITK_LIBRARIES})

по этой причине вы явно устанавливаете LINKER_LANGUAGE - нет ничего для ссылки, и cmake запутался.

Итак, include_directories достаточно:

include_directories(${PROJECT_SOURCE_DIR}/lib)

Кстати:

Вам не нужно проверять ITK_FOUND, если вы укажете REQUIRED:

FIND_PACKAGE (ITK REQUIRED)
IF( ITK_FOUND )
  include( ${ITK_USE_FILE} )
ENDIF( ITK_FOUND )

из документации:

The REQUIRED option stops processing with an error message if the package cannot be found.


PROJECT_SOURCE_DIR не обязательно равно itkNormals_SOURCE_DIR (вы можете использовать этот файл из другого проекта):

include_directories(${PROJECT_SOURCE_DIR}/lib)

Можно исправить одним из способов:

include_directories(${itkNormals_SOURCE_DIR}/lib)
include_directories(${CMAKE_CURRENT_LIST_DIR}/../lib)

или просто включить из родительского файла:

# src/CMakeLists.txt
include_directories("./lib")
person Community    schedule 14.11.2013
comment
Это хороший путеводитель. И советы очень полезные. Мне не удалось найти хорошее руководство по CMake. Я давно не программировал на скомпилированном языке, поэтому я немного заржавел в создании библиотек (а когда я это делал, CMake еще не существовало!). В итоге я поместил все исходные файлы в одну библиотеку. - person jmerkow; 15.11.2013
comment
Это не работает для меня, но, возможно, я делаю это неправильно. Родительский файл CMakeLists.txt ?? - person Sebastianor; 14.03.2016
comment
Когда я добавляю include_directories(./lib) в CMakeList.txt, ошибка вывода такая же :( - person Sebastianor; 14.03.2016
comment
Вот мой вопрос stackoverflow.com /вопросы/36632618/ - person Sebastianor; 14.04.2016