【问题标题】:CMake Setting up Release and Debug version and FlagsCMake 设置发布和调试版本和标志
【发布时间】:2023-03-12 08:40:02
【问题描述】:

我是 CMake 新手,我正在尝试编译我的项目。该项目创建了一些静态库和一些可执行文件。

以下是我拥有的文件结构的示例。

项目

  • 构建/linux

    1. CMakeLists.txt(主 CMakelist 文件)
  • build/linux/Release(应该包含发布库和文件)

  • build/linux/Debug(应包含文件的调试版本)

  • SRC

    1. 子项目_1
      此文件夹的 .cpp(所有源文件)和 CMakeLists.txt 1(创建静态库)
    2. 子项目_2
      此文件夹的 .cpp(所有源文件)和 CMakeLists.txt 2(创建静态库)
    3. 子项目_3
      .cpp(所有源文件)和 CMakeLists.txt 3 用于此文件夹(创建可执行文件)
  • 包括

    1. 子项目_1
      .h(所有头文件)
    2. 子项目_2
      .h(所有头文件)
    3. 子项目_3
      .h(所有头文件)

主 CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
SET(CMAKE_CXX_COMPILER "g++")
Project(ort)

#set the source and header directories location
set(ORT_HEADER_DIRECTORY "../../include") #include folder structure explained above
set(ORT_SOURCE_DIRECTORY "../../src")
set(ORT_BINARY_DIRECTORY "../../lib")  # lib folder to contain all the libraries

set (CMAKE_CURRENT_BINARY_DIR ".")

#Include the library packages
include_directories("/usr/include/wx-2.8")
include_directories("/usr/local/cuda/include") and so on


#set the names of all the projects (for creating the libraries)
SET(PROJECT_NAMES "log" "data" "cc")

foreach(PROJECT_NAME ${PROJECT_NAMES})
     # Create the cmake related files in the out folder so that the libraries can be
     # copied to the lib folder
     add_subdirectory( "{ORT_SOURCE_DIRECTORY}/${PROJECT_NAME}" "${CMAKE_CURRENT_BINARY_DIR}/out/${PROJECT_NAME}"

endforeach(PROJECT_NAME ${PROJECT_NAMES})

#set the names of all the projects (for creating the libraries)
SET(EXECUATALE_PROJECTS "metadata" )

foreach(EXECUATALE_PROJECT ${EXECUATALE_PROJECTS})
     # Create the cmake related files in the out folder so that the libraries can be
     # copied to the lib folder
     add_subdirectory( "{ORT_SOURCE_DIRECTORY}/${EXECUATALE_PROJECT}" "${CMAKE_CURRENT_BINARY_DIR}/out/${EXECUATALE_PROJECT}"

endforeach(EXECUATALE_PROJECT ${EXECUATALE_PROJECTS})

日志目录的 CMakeLists.txt 文件(与我用于 cc 和数据项目的逻辑相同)

SET (CMAKE_CXX_FLAGS " -g -Wall -pThread")
include_directories(${ORT_HEADER_DIRECTORY})
SET(LOG_SOURCE a.cpp b.cpp c.cpp)
ADD_LIBRARY(log_d ${LOG_SOURCE})
target_link)libraries(log_d cc_d data_d)

元数据 CMakeLists.txt 文件(创建可执行项目)

SET (CMAKE_CXX_FLAGS " -g -Wall -pThread")
FIND_PACKAGE(wxWidgets)
IF(wxWidgets_FOUND)
        INCLUDE(${wxWidgets_USE_FILE})
ENDIF(wxWidgets_FOUND)

Include_Directories(${wxWidgets_INCLUDE_DIRS})
include_directories(${ORT_HEADER_DIRECTORY})
include_directories("/usr/ort/lib/unixODBC/include")

SET(META_SOURCE meta.cpp data.cpp)

ADD_EXECUTABLE(meta_d ${META_SOURCE })
TARGET_LINK_LIBRARIES(meta_d log_d data_d)

目前通过这篇文章,我可以在 build/linux/out 文件夹中成功生成所需的库。我确实创建了发布和调试文件夹并尝试构建相同的文件夹。这些文件在各自的 RElease 或 Debug 文件夹中创建和构建。 光盘发布

cmake -DCMAKE_BUILD_TYPE=发布..

制作

问题: 1) 由于项目既可以在 build/linux 级别构建,也可以在 build/linux/Release build/linux/Debug 级别构建,有没有办法只能在 build/linux 级别编译项目在提供的发布或调试选项上(此外,文件将根据指定的选项放置在调试或发布文件夹中)。

即我想做 cmake -DCMAKE_BUILD=Release 。在 build/linux 级别而不是发布调试级别。

我确实尝试在 build/linux 级别使用以下选项运行

cmake -DCMAKE_BUILD_TYPE=调试

但我收到一条错误消息 Unknown argument specified。能否请您告诉我如何设置此配置,以便稍后我可以将其集成到 Eclipse 中

2) 我想根据指定的调试和版本为每个项目设置编译标志,我该怎么做?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    CMakeLists.txt 属于源目录,而不是构建目录。在您第一次在构建目录中执行 cmake 之前,它应该是空的。 您不应直接与 pthread 链接,而应使用以下方法:

    find_package( Threads )
    target_link_libraries( proyectA lib1 lib2 ... ${CMAKE_THREAD_LIBS_INIT})
    

    1) 据我所知,您可以使用任何目录,但每个目录/cmake 执行中只能有一种构建类型。

    您应该知道,使用 CMAKE_BUILD_TYPE=Debug 会自动将调试标志添加到构建中,因此“-g”参数是多余的。

    您可能还应该使用 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") 来不取消设置 cmake 用于 gcc 的默认参数。

    2) Cmake 有一个带有每个构建类型的默认参数的变量。您可以为每个添加自己的。 例如,这样的事情可能会奏效:

    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") 
    

    查看post了解更多详情。

    【讨论】:

    • there can be only one type of build in each directory/cmake execution 不适用于 XcodeMS Visual Studio 生成器
    猜你喜欢
    • 2018-11-13
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多