CMake:如何在配置步骤中构建然后链接库

时间:2019-03-25 00:15:25

标签: build cmake glfw internals

我正在尝试使用CMake生成OpenGL项目模板。我的设置需要GLFW静态库https://github.com/glfw/glfw; GLFW也使用CMake构建。

我想在我的项目的configure步骤中生成并链接此库。我已经从github克隆了我的CMakeLists.txt,但是我很难在脚本中构建它。我的想法是执行以下步骤:

  1. 克隆库
  2. 选择特定的提交
  3. 在构建目录中配置glfw cmake文件
  4. 构建glfw库
  5. 将库复制到适当的位置并设置为可使用。

但是,在CMakeLists.txt中执行步骤3和4似乎失败。我可以手动导航到glfw的构建文件夹,在终端中键入以下内容:

cmake ..
cmake --build . --config Release

键入以上内容即可构建库。但是在CMakeLists.txt中执行相同的命令不会得到相同的结果,它似乎跳过了配置步骤,然后跳过了cmake--build。 --config发布步骤失败,并显示Error: could not load cache

也许这不是最好的工作流程,我很乐意提出建议。我对编写CMakeLists.txt相对缺乏经验。这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(OpenGLBasedApp VERSION 1.0)


#########################################################################################################
# GLFW
#########################################################################################################


#-----clone GLFW repository-----
set(glfw_dir_rel "./third_party/git_repos/glfw")
message(STATUS "running command:" ${git_clone_glfw_cmd})
execute_process(
    COMMAND git clone https://github.com/glfw/glfw.git ${glfw_dir_rel}
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
    OUTPUT_VARIABLE git_glfw_clone_output
    RESULT_VARIABLE git_glfw_clone_result
    ERROR_QUIET
    )
# message(STATUS "clone return status: ${git_glfw_clone_result}") 0 on success, 128 on already cloned

#-----switch to specific commit; change this if you want latest version-----
set(supported_glfw_commit "8d7e5cdb49a1a5247df612157ecffdd8e68923d2")
set(glfw_dir_abs "${PROJECT_SOURCE_DIR}${glfw_dir_rel}")
message(STATUS "${glfw_dir_abs}")
#if(git_glfw_clone_result EQUAL "0")
    message(STATUS "glfw clone successful -- checking out stable commit ${supported_glfw_commit}")
    execute_process(
        COMMAND git checkout ${supported_glfw_commit}
        WORKING_DIRECTORY "${glfw_dir_abs}"
        OUTPUT_VARIABLE glfw_checkout_std_out
        RESULT_VARIABLE glfw_checkout_ret_val
        #ERROR_QUIET
    )
    #message(STATUS ::: ${glfw_checkout_std_out})
    #message(STATUS ::: ${glfw_checkout_ret_val})
#endif()

# ----- build GLFW to use -----

#the output location of this library may be playform dependent and should be tested
#make the directory for build; relative path seems to be required as directory does not show up with concatenated path
set(glfw_build_dir_rel "${glfw_dir_rel}/build")
file(MAKE_DIRECTORY "${glfw_build_dir_rel}")
message(STATUS "building GLFW, this may take a moment...")
execute_process(
    COMMAND cmake ..
    COMMAND cmake --build . --config Release
    WORKING_DIRECTORY "${glfw_build_dir_rel}"
    OUTPUT_VARIABLE glfw_build_out
    RESULT_VARIABLE glfw_build_ret
    #ERROR_QUIET
)
message(STATUS "glfw status: \n ${glfw_build_ret}")
message(STATUS "glfw build:  \n ${glfw_build_out}")


#########################################################################################################
# Main Application
#########################################################################################################

file(GLOB_RECURSE app_files_var 
    "src/*.h"
    "src/*.c"
    "src/*.hpp"
    "src/*.cpp"
)

add_executable(App ${app_files_var})

我还没有尝试过步骤5,因为我无法使其成功构建。任何帮助将不胜感激。

0 个答案:

没有答案