【问题标题】:Using assimp makes compilations 30 times slower使用 assimp 会使编译速度慢 30 倍
【发布时间】:2022-11-06 23:40:17
【问题描述】:

我正在使用 cmake 并包含带有以下两行的 assimp:

add_subdirectory(external/assimp)
target_link_libraries(${PROJECT_NAME} assimp)

我还在我的 cpp 中添加了 #include <assimp/Importer.hpp>

通常编译需要大约 2 秒。 但是,如果我在代码中实际使用 assimp,例如添加以下行:

Assimp::Importer importer;

在其他任何地方都没有提到 assimp,它会跳到大约 55 秒。请注意,#include <assimp/Importer.hpp> 在这两种情况下都存在。 步骤[1/2] Building CXX object CMakeFiles/Project.dir/src/Project.cpp.obj 花费了大部分时间。

如果我更新代码,只要使用 assimp,重新编译将需要大约 55 秒才能重新编译。

我尝试将包含放入预编译的标头中,但行为是相同的。 我究竟做错了什么?为什么需要这么长时间?

我正在使用 CLion,但使用来自 msys2/mingw64 安装的 gcc。

这是完整的 cmake 文件:

cmake_minimum_required(VERSION 3.21)
project(PathTracer)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
set(CMAKE_CXX_STANDARD 23)

find_package(Vulkan REQUIRED)

add_executable(${PROJECT_NAME} src/main.cpp src/Project.h src/Project.cpp)

target_link_libraries(${PROJECT_NAME} Vulkan::Headers)

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(external/glfw)
target_link_libraries(${PROJECT_NAME} glfw)

add_subdirectory(external/assimp)
target_link_libraries(${PROJECT_NAME} assimp)

add_subdirectory(shaders)
add_dependencies(${PROJECT_NAME} Shaders)

target_precompile_headers(${PROJECT_NAME} PRIVATE src/pch.h)

if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/assets)
    #Developer mode needs to be active on Windows 10 or later for this command to work
    file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/assets ${CMAKE_CURRENT_BINARY_DIR}/assets SYMBOLIC)
endif ()

if (ENABLE_VALIDATION)
    add_definitions(-DENABLE_VALIDATION=1)
endif (ENABLE_VALIDATION)

if (ENABLE_API_DUMP)
    add_definitions(-DENABLE_API_DUMP=1)
endif (ENABLE_API_DUMP)

【问题讨论】:

  • 您是想使用安装在系统中或坐在某个地方的已构建的 assimp 库,还是您想自己构建 assimp 库? add_subdirectory(external/assimp) 正在做后者。
  • 我想自己构建它,但我不想每次重新编译自己的代码时都重新构建它。
  • 您可以查看预编译的标头。不过,不确定 MinGW 是否支持它们。
  • 哦,我试过了。它没有任何区别。即使使用预编译头文件中的头文件,编译时间也会根据我是否实际使用 Assimp 而发生巨大变化。会不会是链接器?
  • 正如凯文所说,你正在建立自己的 assimp。如果您使用find_package(assimp CONFIG REQUIRED)target_link_libraries(${PROJECT_NAME} assimp) 并删除带有add_subdirectory 的行,并使用预编译的标头,则不再重新编译assimp,并且构建会跳过它们。我正在我自己的项目中这样做。

标签: c++ cmake assimp


【解决方案1】:

如果链接需要很长时间,请将 Assimp 链接为动态/共享库而不是静态库。

至于你将如何做到这一点:set(BUILD_SHARED_LIBS ON) 在你之前add_subdirectory(assimp)

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2017-10-26
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多