2012-11-09 135 views
2

我是新来的CMake,我想让我的项目编译。该项目创建了一些静态库和一些可执行文件。CMake设置发布和调试版本和标志

下面是我有的文件结构的例子。

项目

  • 编译/ Linux的

    1. 的CMakeLists.txt(主要CMakelist文件)
  • 编译/ Linux的/释放(应包含发行库和文件)

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

  • SRC

    1. subProject_1
      的.cpp(所有源文件)和1的CMakeLists.txt这个文件夹(创建静态库)
    2. subproject_2
      的.cpp(所有源文件)和2的CMakeLists.txt此文件夹(创建静态库)
    3. subproject_3
      的.cpp(所有源文件)和的CMakeLists.txt 3 THI S(创建可执行文件)
  • 包括

    1. subProject_1
      .H(所有头文件)
    2. subProject_2
      .H(所有头文件)
    3. 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) 

目前这件作品可以s在build/linux/out文件夹中成功生成所需的库。我确实创建了发布和调试文件夹,并尝试构建相同的文件夹。这些文件被创建并建立在相应的RElease或Debug文件夹中。 cd版本

cmake -DCMAKE_BUILD_TYPE = Release ..

使

问题: 1)由于,该项目可以在编译/ linux下一级建造既以及构建/ LINUX /发布版本/ LINUX /调试级别,有没有一种方法,通过该项目只能根据所提供的发行版或调试选项在build/linux级别编译(另外,这些文件将根据指定的选项放置在调试版或发行版文件夹中)。

即我想做cmake -DCMAKE_BUILD =发布。在构建/ linux级别而不是版本调试级别。

我曾尝试与构建/ Linux的水平

cmake的-DCMAKE_BUILD_TYPE =调试

下面的选项运行,但我得到了指定的错误消息未知参数。你可以让我知道如何设置这个配置,以便以后我可以将其集成到Eclipse中

2)我想根据指定的调试和版本为每个项目设置编译标志,如何我可以这样做吗?

回答

2

CMakeLists.txt属于源目录,而不是构建目录。在第一次执行build目录中的cmake之前,它应该是空的。 你不应该并行线程直接链接,但用下面的方法:

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

+1

'在每个目录/ cmake execution中只能有一种构建类型''Xcode'和'MS Visual Studio'不适用 – 2013-12-20 16:22:32

相关问题