cmake os x failure ar没有特定的归档成员

jme*_*kow 4 c++ macos makefile cmake unix-ar

我有一个简单的cmake项目,我无法在OS X 10.8.4上编译.cmake/make过程在Linux上运行良好但在OS XI上遇到此错误:

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
Run Code Online (Sandbox Code Playgroud)

我在两个平台上都使用Eclipse CDT4 Generator Unix MakeFile.这似乎与两个系统上的ar之间的差异有关.但是,我在谷歌找不到太多帮助我排除故障.

这里有一些更多的信息

SRC/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)
Run Code Online (Sandbox Code Playgroud)

SRC/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})
Run Code Online (Sandbox Code Playgroud)

的src /测试/的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)
Run Code Online (Sandbox Code Playgroud)

小智 7

您无法从一个头文件创建库:

add_library(ImageFilter itkImageFilter.hxx)
SET_TARGET_PROPERTIES(ImageFilter PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(ImageFilter ${ITK_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

这就是为什么你LINKER_LANGUAGE明确设置的原因- 没有什么可以链接和cmake混淆.

所以include_directories就足够了:

include_directories(${PROJECT_SOURCE_DIR}/lib)
Run Code Online (Sandbox Code Playgroud)

BTW:

您无需检查ITK_FOUND是否指定REQUIRED:

FIND_PACKAGE (ITK REQUIRED)
IF( ITK_FOUND )
  include( ${ITK_USE_FILE} )
ENDIF( ITK_FOUND )
Run Code Online (Sandbox Code Playgroud)

来自文件:

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)
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式修复:

include_directories(${itkNormals_SOURCE_DIR}/lib)
include_directories(${CMAKE_CURRENT_LIST_DIR}/../lib)
Run Code Online (Sandbox Code Playgroud)

或者只是从父文件中包含:

# src/CMakeLists.txt
include_directories("./lib")
Run Code Online (Sandbox Code Playgroud)