向CMake项目添加assimp的最佳方式是什么



我正试图将assimp构建为一个静态库,将其与CMakeFile.txt文件中的可执行文件链接。可执行文件构建得很好,但问题是每次我尝试构建项目时都需要很长时间才能链接。

这是我的CMakeFile.txt:

cmake_minimum_required(VERSION 3.22)
project(3d_renderer)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ./out)
# glfw
set(GLFW_BUILD_DOCS OFF CACHE BOOL "GLFW build documentation" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "GLFW build documentation" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "GLFW build documentation" FORCE)
add_subdirectory(libs/glfw)
# assimp
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE)
set(ASSIMP_BUILD_TESTS OFF CACHE BOOL "Assimp build tests" FORCE)
set(ASSIMP_INSTALL OFF CACHE BOOL "Assimp install" FORCE)
set(ASSIMP_INSTALL_PDB OFF CACHE BOOL "Assimp install PDB" FORCE)
add_subdirectory(libs/assimp)
include_directories(include/
libs/glad/include
libs/glfw/include
libs/glm
libs/imgui
libs/imgui/backends
C:/dev/libs/assimp/include
C:/dev/libs/assimp/build/include)
set(SOURCE_FILES src/main.cpp
src/shader.cpp
src/texture2d.cpp
src/resource_manager.cpp
src/orbit_camera.cpp
libs/glad/src/glad.c
libs/imgui/imgui.cpp
libs/imgui/imgui_demo.cpp
libs/imgui/imgui_draw.cpp
libs/imgui/imgui_tables.cpp
libs/imgui/imgui_widgets.cpp
libs/imgui/backends/imgui_impl_glfw.cpp
libs/imgui/backends/imgui_impl_opengl3.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} glfw ${GLFW_LIBRARIES})
target_link_libraries(${PROJECT_NAME} assimp)
add_custom_target(copy_resources ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory
${PROJECT_SOURCE_DIR}/resources
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources
COMMENT "Copying resources into build directory")
add_dependencies(${PROJECT_NAME} copy_resources)

我的问题是:有没有办法减少链接这个静态库所需的时间,或者将assimp编译为DLL更好?

我不确定链接DLL还是静态库更快,但只要你不对外部库进行任何更改,它就不需要重建,链接应该很快。

就我个人而言,我将assimp添加到项目中的方式是这样的(使用FetchContent,当您运行cmake时,它将从存储库下载文件,然后添加项目(。我静态地构建这个项目很好。

include(FetchContent)
set(FETCHCONTENT_BASE_DIR ${PROJECT_SOURCE_DIR}/libs CACHE PATH "Missing description." FORCE)
FetchContent_Declare(assimp
GIT_REPOSITORY https://github.com/assimp/assimp.git
GIT_TAG master)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(ASSIMP_INJECT_DEBUG_POSTFIX OFF CACHE BOOL "" FORCE)
set(ASSIMP_INSTALL OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(assimp)
target_include_directories(3d_renderer PRIVATE libs/assimp-src/include)
target_link_libraries(3d_renderer assimp)

您可以在该项目的CMakeLists.txt文件中检查这些ASSIMP设置的作用。FetchContent将从存储库下载文件,并在运行cmake命令时构建项目。

我建议不要将外部/库代码作为项目源添加到您的项目中,而是通过target_include_directories添加它们,因此您的代码将是:

target_include_directories(3d_renderer
include/
libs/glad/include
libs/glfw/include
libs/glm
libs/imgui
libs/assimp/include)
set(SOURCE_FILES src/main.cpp
src/shader.cpp
src/texture2d.cpp
src/resource_manager.cpp
src/orbit_camera.cpp)

然后在你的代码中你只需要#include backends/imgui_impl_glfw.cpp

最新更新