【问题标题】:cmake os x failure ar no archive members specificcmake os x failure 没有特定的存档成员
【发布时间】:2013-11-18 16:55:41
【问题描述】:

我有一个简单的 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 之间的区别有关。但是,我在谷歌上找不到太多可以帮助我解决问题的方法。

这里有更多信息给你

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)

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)

【问题讨论】:

    标签: c++ macos makefile cmake unix-ar


    【解决方案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)
    

    顺便说一句

    如果指定REQUIRED,则无需勾选ITK_FOUND

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

    来自documentation

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

    【讨论】:

    • 这是一个很好的指南。而且这些提示非常有帮助,我还没有找到一个好的 CMake 基础指南。我很久没有用编译语言编码了,所以我对库的生成有点生疏(当我这样做的时候,CMake 还不存在!)。我最终将所有源文件放入一个库中。
    • 这对我不起作用,但也许我做错了。父文件是 CMakeLists.txt ??
    • 当我在 CMakeList.txt 中添加 "include_directories("./lib")" 时输出错误是一样的:(
    猜你喜欢
    • 2015-03-07
    • 2013-02-15
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2011-12-29
    • 2014-08-16
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多