【发布时间】: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,并且构建会跳过它们。我正在我自己的项目中这样做。