如何指定编译器和编译不同的主函数



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

  • 一个Output文件夹,其中包含用于输出的所有类。(目前只有Output.cc和Output.h)
  • Math文件夹,包含所有与数学相关的类。(vector.cc、vector.h、randomgen.h、random gen.cc等)
  • Tests文件夹,其中有不同的cpp文件,每个文件都包含一个主函数。(输出测试.cc、矢量测试.cc等)

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

如何指定编译器

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

设置环境变量

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

路径

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

抄送和抄送

CMake读取变量CCCXX以分别确定C编译器和C++编译器的路径。请注意,第一次为项目配置CMake时,它将缓存这些路径,并首先查看缓存中的所有未来配置。因此,如果您希望更改编译器路径,请确保删除缓存文件CMakeCache.txt。正如HughB所指出的,Guillaume 给出了一个很好的例子

定义编译器变量

与使用CC和CXX类似,可以在命令行中定义CMake变量,以选择所需的编译器。它们分别是CCD_ 10和CCD_。您可以使用-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选项来选择生成器。有许多发电机可供选择,我最近回答了一个关于它们的问题。我不打算在这个答案中过多地详细介绍它们,但你可以阅读我的另一个答案来了解更多细节。

示例

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

不要对编译器进行硬编码

我建议不要急于在CMakeLists.txt文件中对编译器进行"硬编码"。CMake是独立于编译器的,您应该在CMake文件外部设置编译器信息。如果您自己或其他人希望使用不同的编译器构建项目,请使用上面提到的方法之一来保持CMake文件的可移植性,并避免混淆。

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

  • 什么是CMake生成器
  • 了解CMake背后的目的

如何编译多个可执行文件

如HughB所述,使用add_executables。你也可以为每个文件夹组创建单独的库,有很多方法可以组织你的项目。我将保持简单,并给出一个在同一项目中构建两个可执行文件的示例。

对于这个例子,我创建了5个文件:

include/Helloworld.h

#include <stdio.h>

src/HelloWorld.cpp

#include "HelloWorld.h"
int main()
{
    printf("Hello World!n");
    return 0;
}

include/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。

考虑将在不同程序主干中使用的代码放在库中。使用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_executabletarget_link_libraries。如果将库命名为MyLib,那么target_link_libraries命令将类似

target_link_libraries( exe1 MyLib )

关于重写编译器,请参阅如何为cmake 指定新的gcc路径

最新更新