【问题标题】:Convert from Xcode to CMake从 Xcode 转换为 CMake
【发布时间】:2016-12-06 17:28:27
【问题描述】:

我有一个最初在我的 Mac 上使用 Xcode 开发的 C++ 项目,我想使用 CMake 设置相同的项目。该项目使用了一些外部库,包括 eigen 和 boost。 Xcode 有一个相当长的构建设置列表,包括外部库的路径、编译器版本的规范、附加的链接器标志、编译器优化级别等......我想知道所有这些信息在 CMakeLists.txt 文件中的位置.我已经广泛搜索了这方面的帮助,但发现很少。我是 CMake 新手,以前从未编写过 make 文件。如果有一个实用程序可以将我的 Xcode 项目转换为 CMake 项目,那将是理想的。但我很高兴知道这方面的教程,或者有一些具体的指导。对此的任何帮助将不胜感激。

【问题讨论】:

    标签: c++ linux xcode macos cmake


    【解决方案1】:

    转化策略

    我很确定迁移到 CMake 的最简单和最快的方法是混合查看链接相同依赖项的可比较项目,并可能将一些相对文件路径复制到您的源文件来自 XCode。 使用 Eigen 和 Boost 的编写良好的 CMakeLists.txt 可以非常小(并且与平台无关)。

    其中一个原因是 CMake 使用依赖项的方式非常不同。 对于 Boost 等知名库,CMake 包含包含标头和链接库的脚本。

    最小化 CMakeLists.txt

    一个最小的例子可能如下所示:

    find_package(Eigen3 REQUIRED)
    find_package(Boost REQUIRED COMPONENTS system)
    add_executable(
      app
      src/main.cpp
    )
    target_include_directories(
      app
      ${Eigen3_INCLUDE_DIRS}
      ${Boost_INCLUDE_DIR}
    )
    target_link_libraries(
      app
      ${Boost_LIBRARIES}
    )
    

    示例项目

    对于 Eigen,没有这样的预安装脚本可以被find_package 调用。 以下是两个链接 Eigen 和 Boost 的真实示例项目:https://github.com/ompl/ompl/blob/master/CMakeLists.txt https://github.com/roboticslibrary/rl

    这是example for a find script for Eigen

    作为一条建议,一些 CMake 项目存在复杂且使用旧语法,较新的项目文件倾向于在命令中使用小写字母。

    【讨论】:

    • 谢谢。包括 eigen 和 boost 的包含目录似乎有帮助(make 过程比以前更远!),但我也在使用 mysql 客户端,这似乎仍然是一个问题,错误“ld: library not找到 -lmysqlclient"。
    • 搜索“cmake mysqlclient”发现stackoverflow.com/a/13846625/2079934 如果库不在默认目录下,则需要自己编写一个Find*.cmake文件。
    【解决方案2】:

    如果发生直接目标链接库不起作用,您将不得不自己编写自己的 Find*.cmake 文件。

    以下是您应该涵盖的规范(这只是一种方法):

    假设你有一个图书馆 XYZ:

    您的文件 FindXYZ.cmake 作为结果应该有一组要使用的变量:

    XYZ_LIBRARIES
    
    XYZ_INCLUDE_DIR
    

    例如:

    set(XYZ_LIBRARIES ${SOME_PATH_TO_LIBRARY1} ${SOME_PATH_TO_LIBRARY2})
    find_path(XYZ_INCLUDE_DIR NAMES xyz/xyz.h HINTS ${PLACE_WHERE_INCLUDE_SHOULD_BE}
      PATH_SUFFIXES include
    )
    

    从你的主 cmake 也许你“使用”它:

    find_package(XYZ REQUIRED)
    
    # Now we use both _INCLUDE_DIR and _LIBRARIES
    
    include_directories(SYSTEM "${XYZ_INCLUDE_DIR}")
    
    # TARGET_NAME is the current target, the 'client' of XYZ
    # append XYZ to our list of libraries to link
    target_link_libraries(${TARGET_NAME} ${XYZ_LIBRARIES})
    

    我肯定遗漏了细节,但这是大意。以下是一些我知道在大型项目中工作的 cmake 脚本:

    OpenSSL 示例

    查找: https://github.com/highfidelity/hifi/blob/Android/cmake/modules/FindOpenSSL.cmake

    客户端(在这种情况下是一个确实需要 OpenSSL 的库): https://github.com/highfidelity/hifi/blob/Android/domain-server/CMakeLists.txt

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2017-10-01
      • 2013-09-11
      • 1970-01-01
      相关资源
      最近更新 更多