首页 文章

CMake设置发布和调试版本和标志

提问于
浏览
2

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

下面是我的文件结构示例 .

项目

  • build / linux

  • CMakeLists.txt(主CMakelist文件)

  • build / linux / Release(应包含发布库和文件)

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

  • SRC

  • subProject_1
    .cpp(所有源文件)和CMakeLists.txt 1用于此文件夹(创建静态库)

  • 子项目_2
    此文件夹的.cpp(所有源文件)和CMakeLists.txt 2(创建静态库)

  • subproject_3
    .cpp(所有源文件)和CMakeLists.txt 3用于此文件夹(创建可执行文件)

  • 包括

  • subProject_1
    .h(所有头文件)

  • subProject_2
    .h(所有头文件)

  • subProject_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文件夹中构建 . cd发布

cmake -DCMAKE_BUILD_TYPE =发布..

使

问题:1)因为,项目可以在build / linux级别以及build / linux / Release build / linux / Debug级别构建,有没有一种方法可以只在build / linux上编译项目基于提供的发布或调试选项的级别(此外,文件将根据指定的选项放置在调试或发布文件夹中) .

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

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

cmake -DCMAKE_BUILD_TYPE =调试

但我收到一条错误消息指定了未知参数 . 您能告诉我如何设置此配置,以便稍后我可以将其集成到Eclipse中

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

1 回答

  • 2

    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“$ -Wall”)来取消设置cmake用于gcc的默认参数 .

    2)Cmake有一个变量,每个构建类型都有默认参数 . 您可以为每个添加自己的 . 例如,像这样的东西可以做到这一点:

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

    有关详细信息,请参阅post .

相关问题