首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用CMake下载预构建库

使用CMake下载预构建库
EN

Stack Overflow用户
提问于 2021-05-02 20:44:18
回答 1查看 322关注 0票数 3

我正在尝试使用FetchContent下载SDL2的预构建开发库。

因此,它们随后可以由FindSDL2.cmake模块拾取。

然而,目前我发现find_package在库下载之前就被执行了,这导致在定位SDL2时第一次干净的CMake构建失败。

但是,在第二次运行时,由于预构建库已经被缓存,因此SDL2位于第二次运行时。

关于如何确保在调用find_package之前已下载这些预构建库的任何建议

我的CMakeLists.txt文件。

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.19.2)

project(racer VERSION 0.1.0)

# Racer
file(GLOB SOURCES src/*.cpp)
add_executable(${PROJECT_NAME} ${SOURCES})

# OpenGL
find_package(OpenGL REQUIRED)
target_include_directories(${PROJECT_NAME} PRIVATE ${OPENGL_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES})

# FindSDL2 Modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

# Fetch Content Module
include(FetchContent)

# Visual C++
## SDL2
FetchContent_Declare(
  SDL2
  URL     https://www.libsdl.org/release/SDL2-devel-2.0.14-VC.zip
  URL_MD5 2b521c5ec247955dc342235d06ebd874
)
FetchContent_MakeAvailable(SDL2)
set(SDL2_PATH ${sdl2_SOURCE_DIR})
find_package(SDL2 REQUIRED)
target_include_directories(${PROJECT_NAME} PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})
add_custom_command(TARGET racer POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${sdl2_SOURCE_DIR}/lib/x64
        $<TARGET_FILE_DIR:racer>)

第一次运行日志。

代码语言:javascript
复制
[main] Configuring folder: racer 
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug "-DCMAKE_C_COMPILER:FILEPATH=C:\Program Files\LLVM\bin\clang.exe" "-DCMAKE_CXX_COMPILER:FILEPATH=C:\Program Files\LLVM\bin\clang++.exe" -Hc:/Users/Josh/projects/racer -Bc:/Users/Josh/projects/racer/build -G "Unix Makefiles"
[cmake] Not searching for unused variables given on the command line.
[cmake] -- The C compiler identification is Clang 12.0.0 with GNU-like command-line
[cmake] -- The CXX compiler identification is Clang 12.0.0 with GNU-like command-line
[cmake] -- Detecting C compiler ABI info
[cmake] -- Detecting C compiler ABI info - done
[cmake] -- Check for working C compiler: C:/Program Files/LLVM/bin/clang.exe - skipped
[cmake] -- Detecting C compile features
[cmake] -- Detecting C compile features - done
[cmake] -- Detecting CXX compiler ABI info
[cmake] -- Detecting CXX compiler ABI info - done
[cmake] -- Check for working CXX compiler: C:/Program Files/LLVM/bin/clang++.exe - skipped
[cmake] -- Detecting CXX compile features
[cmake] -- Detecting CXX compile features - done
[cmake] -- Found OpenGL: opengl32   
[cmake] CMake Error at C:/Program Files/CMake/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
[cmake]   Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR)
[cmake] Call Stack (most recent call first):
[cmake]   C:/Program Files/CMake/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:582 (_FPHSA_FAILURE_MESSAGE)
[cmake]   cmake/sdl2/FindSDL2.cmake:313 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
[cmake]   CMakeLists.txt:29 (find_package)
[cmake] 
[cmake] 
[cmake] -- Configuring incomplete, errors occurred!
[cmake] See also "C:/Users/Josh/projects/racer/build/CMakeFiles/CMakeOutput.log".
[cmake] See also "C:/Users/Josh/projects/racer/build/CMakeFiles/CMakeError.log".

第二次运行日志(不清除build目录)。

代码语言:javascript
复制
[main] Configuring folder: racer 
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug "-DCMAKE_C_COMPILER:FILEPATH=C:\Program Files\LLVM\bin\clang.exe" "-DCMAKE_CXX_COMPILER:FILEPATH=C:\Program Files\LLVM\bin\clang++.exe" -Hc:/Users/Josh/projects/racer -Bc:/Users/Josh/projects/racer/build -G "Unix Makefiles"
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Found SDL2: C:/Users/Josh/projects/racer/build/_deps/sdl2-src/lib/x64/SDL2.lib (found version "2.0.14") 
[cmake] CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:426 (message):
[cmake]   The package name passed to `find_package_handle_standard_args` (SDL2main)
[cmake]   does not match the name of the calling package (SDL2).  This can lead to
[cmake]   problems in calling code that expects `find_package` result variables
[cmake]   (e.g., `_FOUND`) to follow a certain pattern.
[cmake] Call Stack (most recent call first):
[cmake]   cmake/sdl2/FindSDL2.cmake:318 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
[cmake]   CMakeLists.txt:29 (find_package)
[cmake] This warning is for project developers.  Use -Wno-dev to suppress it.
[cmake] 
[cmake] -- Found SDL2main: C:/Users/Josh/projects/racer/build/_deps/sdl2-src/lib/x64/SDL2main.lib (found version "2.0.14") 
[cmake] -- Configuring done
[cmake] -- Generating done
[cmake] -- Build files have been written to: C:/Users/Josh/projects/racer/build
EN

Stack Overflow用户

发布于 2021-06-24 08:09:59

我认为您需要在第一个project()调用之前做好所有的FetchContent工作。然后在调用project()之后调用find_package()

文档中没有明确介绍,但是有一个指定使用工具链文件的示例,即使工具链文件是通过FetchContent下载的:https://cmake.org/cmake/help/latest/module/FetchContent.html#examples

未经测试,但可能:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.19.2)

# Fetch Content Module
include(FetchContent)

# Visual C++
## SDL2
FetchContent_Declare(
SDL2
URL     https://www.libsdl.org/release/SDL2-devel-2.0.14-VC.zip
URL_MD5 2b521c5ec247955dc342235d06ebd874
)
FetchContent_MakeAvailable(SDL2)
set(SDL2_PATH ${sdl2_SOURCE_DIR})

project(racer VERSION 0.1.0)

# Racer
file(GLOB SOURCES src/*.cpp)
add_executable(${PROJECT_NAME} ${SOURCES})

# OpenGL
find_package(OpenGL REQUIRED)
target_include_directories(${PROJECT_NAME} PRIVATE ${OPENGL_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES})

# FindSDL2 Modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

find_package(SDL2 REQUIRED)
target_include_directories(${PROJECT_NAME} PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})
add_custom_command(TARGET racer POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${sdl2_SOURCE_DIR}/lib/x64
        $<TARGET_FILE_DIR:racer>)
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67356549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档