【问题标题】:CMake: Link precompiled library depending on OS and architectureCMake:根据操作系统和架构链接预编译库
【发布时间】:2013-06-15 18:47:56
【问题描述】:

我有不同的第 3 方库(Windows/Linux/Mac,32/64 位)的预编译版本。它必须包含在项目文件中,以将在其他系统上的编译要求保持在最低限度,因为我不能指望它在多年后可供下载。静态和动态版本都可用,但没有来源。

我应该如何在我的CMakeLists.txt 中链接它,以便依赖的main.cpp 在所有系统上编译?它可以在不同的 Linux 发行版上运行吗?

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(ExampleProject)
LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/libs)
ADD_EXECUTABLE(Test main.cpp)
TARGET_LINK_LIBRARIES(Test lib1_win32)

这适用于 Windows,但显然不考虑不同的操作系统和体系结构。我知道LINK_DIRECTORIES 的替代品,这只是一个例子。

【问题讨论】:

    标签: linker cmake


    【解决方案1】:

    使用 CMAKE_SYSTEM_NAME 测试操作系统,使用 CMAKE_SIZEOF_VOID_P 测试它是 32 位还是 64 位:

    if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
        if (${CMAKE_SIZEOF_VOID_P} MATCHES "8")
            target_link_libraries(Test lib1_linux64)
        else()
            target_link_libraries(Test lib1_linux32)
        endif()
    elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
        if (${CMAKE_SIZEOF_VOID_P} MATCHES "8")
            target_link_libraries(Test lib1_win64)
        else()
            target_link_libraries(Test lib1_win32)
        endif()
    # ETC
    endif()
    

    顺便说一句,我的示例是针对 CMake 2.8,您必须针对 2.6 调整测试。

    【讨论】:

    • 谢谢!所以没有自动的方法来处理这个?我不愿意硬编码任何系统特定的东西。
    • 另一种方法是告诉 CMake 尝试链接到这些库中的每一个。只有与您正在构建的系统匹配的库才能成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2021-05-20
    • 2011-04-06
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多