c++ - cmake os x 失败 ar 没有特定的存档成员

标签 c++ macos makefile cmake unix-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 之间的区别有关。但是,我在谷歌上找不到太多可以帮助我排除故障的东西。

这里有更多的信息给你

源文件/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)

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})

src/test/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)

最佳答案

您不能从一个头文件创建库:

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)

顺便说一句:

如果指定REQUIRED,则无需检查ITK_FOUND:

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

来自 documentation :

如果找不到包,REQUIRED 选项会停止处理并显示错误消息。


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")

关于c++ - cmake os x 失败 ar 没有特定的存档成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19829281/

相关文章:

ios - 了解 Swift 的数组实现

android - Titanium 找不到我的 Android Nexus 设备

c++ - 使用 vpaths 时需要两次 "make"

c - 由于 .h 上的 "preprocessor define"重新编译

makefile - 是否可以在 Gitlab CI 中仅重建更新的文件?

c++读取文件并将整数存储在 vector 中。最终占用的内存比实际文件大小多 5 倍

C++ STL vector 保留

macos - 操作系统 : check if screen is sleep or awake from command line

C++ 一个文件多个类

c++ - 函数返回样式合乎逻辑并且可以吗?