如何指定编译器和编译不同的主要功能

时间:2014-09-29 17:19:50

标签: c++ compilation cmake

我的项目非常简单,但为了清晰起见,我喜欢将文件保存在不同的文件夹中。例如,我有三个文件夹。

  • 包含用于输出的所有类的Output文件夹。 (现在只有Output.cc和Output.h)。
  • 一个Math文件夹,包含与math相关的所有类。 (vector.cc,vector.h,randomgen.h,randomgen.cc等)
  • 一个Tests文件夹,其中有不同的cpp文件,每个文件包含一个main函数。 (Output_test.cc,vector_test.cc等)

如何使用不同文件夹中的类创建符合不同测试程序的所有不同主要功能的CMake脚本? 另外,我没有看到编译器及其选项在CMake文件中的位置。

2 个答案:

答案 0 :(得分:2)

如何指定编译器?

有几种方法可以指定要使用的编译器。设置环境变量,定义编译器变量或指定生成器。

设置环境变量

有两种方法可以使用环境变量来帮助CMake确定在CMake配置期间使用哪个编译器。使用PATH变量或CCCXX变量。

PATH

确保所需编译器的路径位于列表中的第一位。如果您不想修改路径,请使用第二个选项。

CC& CXX

CMake读取变量CCCXX以分别确定C编译器和C ++编译器的路径。请注意,第一次为项目配置CMake时,它将缓存这些路径,并首先查看缓存以查看将来的所有配置。因此,如果您希望更改编译器路径,请务必删除缓存文件CMakeCache.txt。正如HughB pointed outGuillaume

给出了一个很好的例子

定义编译器变量

与使用CC和CXX类似,可以在命令行中定义CMake变量以选择所需的编译器。它们是CMAKE_C_COMPILERCMAKE_CXX_COMPILER。您可以使用-D选项设置它们,它们使用与CC和CXX相同的值。注意,就像CC和CXX一样,这些在第一次CMake配置后被缓存。

实施例

cmake -DCMAKE_CXX_COMPILER=/usr/bin/g++4.6/g++ -DCMAKE_C_COMPILER=/usr/bin/gcc4.6/gcc <path to src>

指定生成器

选择编译器的最后一种方法是使用-G选项选择生成器。有许多发电机可供选择,我最近回答了一个关于它们的问题。我在这个答案中不会详细介绍它们,但您可以read my other answer了解更多详情。

实施例

cmake -G "Unix Makefile" <path to src>

不要对编译器进行硬编码

我建议抵制“硬编码”的冲动&#34; CMakeLists.txt文件中的编译器。 CMake旨在独立于编译器,您应该在CMake文件外部设置编译器信息。使用上面提到的方法之一来保持CMake文件的可移植性,并避免混淆,如果您自己或其他人想要使用不同的编译器构建项目。

相关参考资料。 (免责声明:由我撰写)


如何编译多个可执行文件?

正如HughB提到的那样使用add_executables。您还可以为每个文件夹组创建单独的库,有许多方法可以组织项目。我将保持简单,并举例说明在同一个项目中构建两个可执行文件。

在本例中,我创建了5个文件:

包括/ Helloworld.h

#include <stdio.h>

的src / HelloWorld.cpp

#include "HelloWorld.h"

int main()
{
    printf("Hello World!\n");

    return 0;
}

包括/ HelloWorld2.h

#include <stdio.h>

的src / HelloWorld2.cpp

#include "HelloWorld2.h"

int main()
{
    printf("Hello World2!\n");

    return 0;
}

的CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

# This is required to compile and must contain the paths to
# all of the header files
include_directories(include)

# These are optional, but are added to be passed to the
# add_executable command so that the headers are accessible 
# from within the project
set(HW_INCLUDES include/HelloWorld.h)
set(HW_INCLUDES2 include/HelloWorld2.h)

project(HelloWorlds)

# Required sources
set(HW_SOURCES src/HelloWorld.cpp)
set(HW_SOURCES2 src/HelloWorld2.cpp)

add_executable(HelloWorld ${HW_SOURCES} ${HW_INCLUDES}) 
add_executable(HelloWorld2 ${HW_SOURCES2} ${HW_INCLUDES2})

构建此项目时,将有两个可执行文件:HelloWorld.exe和HelloWorld2.exe。

答案 1 :(得分:1)

考虑将将在不同程序主管中使用的代码放入库中。使用 add_library 命令创建库。您可以拥有如下目录层次结构:

TopDir
   CMakeLists.txt
   MyLib
      CMakeLists.txt
      vector.cc
      vector.h
      ....
   MyExe1
      CMakeLists.txt
      main1.cc
   MyExe2
      CMakeLists.txt
      main2.cc

在顶级cmakelists.txt中使用 add_subdirectory 来遍历目录。在构建可执行文件的目录中,使用 add_executable target_link_libraries 。如果您将库命名为MyLib,那么您的target_link_libraries命令将类似于

target_link_libraries( exe1 MyLib )

关于覆盖编译器,请参阅how to specify new gcc path for cmake

相关问题