【问题标题】:Assimp Cmake ExternalProject statically link MSVCAssimp Cmake ExternalProject 静态链接 MSVC
【发布时间】:2021-10-25 04:08:26
【问题描述】:

我正在尝试将 assimp 添加到 cmake 构建中。我需要静态构建库,静态链接 msvc(/MT 用于发布,/MTd 用于调试)。似乎没有特定的 cmake 选项来启用/禁用 assimp 本身。我尝试了以下方法来强制库静态链接 msvc:

set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

if(MSVC)
    add_compile_options(
        $<$<CONFIG:>:/MT> #---------|
        $<$<CONFIG:Debug>:/MTd> #---|-- Statically link the runtime libraries
        $<$<CONFIG:Release>:/MT> #--|
    )   
endif()

这两者似乎都没有任何效果,因为库继续构建为 /MD 或 /MDd。 assimp 是否有一个特定的标志来启用或禁用我找不到的静态链接 msvc?如果不是,我怎么能做到这一点?以下是我的CMakeLists.txt 文件的相关部分:

# SETUP ASSIMP
set(libAssimp assimp)
ExternalProject_Add(${libAssimp}
PREFIX          ${CMAKE_CURRENT_BINARY_DIR}/_deps/${libAssimp}
GIT_REPOSITORY  https://github.com/assimp/assimp.git
GIT_TAG         v5.0.1
GIT_SHALLOW     ON
UPDATE_COMMAND  ""
CMAKE_ARGS      -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/_deps/installs/${libAssimp}
                -DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT:BOOL=OFF
                -DASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT:BOOL=OFF
                -DASSIMP_BUILD_ASSIMP_TOOLS:BOOL=OFF
                -DASSIMP_BUILD_TESTS:BOOL=OFF
                -DASSIMP_BUILD_FBX_IMPORTER:BOOL=ON
                -DASSIMP_BUILD_OBJ_IMPORTER:BOOL=ON
                -DASSIMP_BUILD_OBJ_EXPORTER:BOOL=ON
                -DASSIMP_BUILD_ZLIB:BOOL=ON
                -DASSIMP_LIBRARY_SUFFIX:STRING=
                -DLIBRARY_SUFFIX:STRING=
                -DCMAKE_DEBUG_POSTFIX:STRING=
                -DASSIMP_INJECT_DEBUG_POSTFIX:BOOL=OFF
                -DBUILD_SHARED_LIBS:BOOL=OFF
)

set(ASSIMP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/installs/${libAssimp})
add_library(ASSIMP_LIBRARY STATIC IMPORTED)
set_target_properties(ASSIMP_LIBRARY PROPERTIES IMPORTED_LOCATION ${ASSIMP_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}assimp${CMAKE_STATIC_LIBRARY_SUFFIX})

add_library(IRRXML_LIBRARY STATIC IMPORTED)
set_target_properties(IRRXML_LIBRARY PROPERTIES IMPORTED_LOCATION ${ASSIMP_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}IrrXML${CMAKE_STATIC_LIBRARY_SUFFIX})

add_library(ZLIB_LIBRARY STATIC IMPORTED)
set_target_properties(
ZLIB_LIBRARY 
PROPERTIES 
    IMPORTED_LOCATION_RELEASE ${ASSIMP_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zlibstatic${CMAKE_STATIC_LIBRARY_SUFFIX}
    IMPORTED_LOCATION_MINSIZEREL ${ASSIMP_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zlibstatic${CMAKE_STATIC_LIBRARY_SUFFIX}
    IMPORTED_LOCATION_RELWITHDEBINFO ${ASSIMP_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zlibstatic${CMAKE_STATIC_LIBRARY_SUFFIX}
    IMPORTED_LOCATION_DEBUG ${ASSIMP_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zlibstaticd${CMAKE_STATIC_LIBRARY_SUFFIX}
)

更新

我相信我可能已经想通了。虽然我之前尝试将CMAKE_MSVC_RUNTIME_LIBRARYMSVC_RUNTIME_LIBRARY 添加到CMAKE_FLAGS 无济于事......我认为cmake 可能一直在缓存原始值,因为我只是尝试独立于我的超级构建下载assimp,确保缓存是使用上述标志清除和构建,VS 显示为/MT。一旦我用ExternalProject_Add确认这在我的超级版本中工作,我会报告。

UPDATE002

好的,IDK 我在上面的解释中是如何做到这一点的,但是我无法通过与以前相同的过程来复制它。清除了 cmake 缓存,使用了所有相同的选项,再次卡在 /MD 上。

【问题讨论】:

    标签: c++ visual-c++ cmake assimp


    【解决方案1】:

    assimp 的 CMakeLists.txt 文件的最低版本为 3.10(截至本文)。因此MSVC 标志被忽略。直接构建项目时,将以下内容添加到项目CMakeLists.txt 文件中:

    cmake_policy(SET CMP0091 NEW)
    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
    

    根据this post,当通过ExternalProject_Add 加载时,您必须使用CMAKE_ARGS 参数传递参数,例如(最后两个args):

    set(libAssimp assimp)
    ExternalProject_Add(${libAssimp}
    PREFIX          ${CMAKE_CURRENT_BINARY_DIR}/_deps/${libAssimp}
    GIT_REPOSITORY  https://github.com/assimp/assimp.git
    GIT_TAG         v5.0.1
    GIT_SHALLOW     ON
    UPDATE_COMMAND  ""
    CMAKE_ARGS      -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/_deps/installs/${libAssimp}
                    -DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT:BOOL=OFF
                    -DASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT:BOOL=OFF
                    -DASSIMP_BUILD_ASSIMP_TOOLS:BOOL=OFF
                    -DASSIMP_BUILD_TESTS:BOOL=OFF
                    -DASSIMP_BUILD_FBX_IMPORTER:BOOL=ON
                    -DASSIMP_BUILD_OBJ_IMPORTER:BOOL=ON
                    -DASSIMP_BUILD_OBJ_EXPORTER:BOOL=ON
                    -DASSIMP_BUILD_ZLIB:BOOL=ON
                    -DASSIMP_LIBRARY_SUFFIX:STRING=
                    -DLIBRARY_SUFFIX:STRING=
                    -DCMAKE_DEBUG_POSTFIX:STRING=
                    -DASSIMP_INJECT_DEBUG_POSTFIX:BOOL=OFF
                    -DBUILD_SHARED_LIBS:BOOL=OFF
                    -DCMAKE_POLICY_DEFAULT_CMP0091:STRING=NEW
                    -DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=MultiThreaded$<$<CONFIG:Debug>:Debug>
    )
    

    【讨论】:

      猜你喜欢
      • 2020-01-13
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多