如何指定编译器和编译不同的主函数
How to Specify the Compiler and To Compile Different Main Functions
我的项目很简单,但为了清晰起见,我喜欢将文件保存在不同的文件夹中。例如,我有三个文件夹。
- 一个
Output
文件夹,其中包含用于输出的所有类。(目前只有Output.cc和Output.h) Math
文件夹,包含所有与数学相关的类。(vector.cc、vector.h、randomgen.h、random gen.cc等)Tests
文件夹,其中有不同的cpp文件,每个文件都包含一个主函数。(输出测试.cc、矢量测试.cc等)
如何使用不同文件夹中的类创建符合不同测试程序的所有不同主功能的CMake脚本?此外,我没有看到编译器及其选项在CMake文件中的指定位置。
如何指定编译器
有几种方法可以指定要使用的编译器。设置环境变量、定义编译器变量或指定生成器。
设置环境变量
有两种方法可以使用环境变量来帮助CMake确定在CMake配置期间使用哪个编译器。使用PATH
变量或CC
和CXX
变量。
路径
请确保所需编译器的路径位于列表的第一位。如果您不想修改路径,请使用第二个选项。
抄送和抄送
CMake读取变量CC
和CXX
以分别确定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_executable和target_link_libraries。如果将库命名为MyLib,那么target_link_libraries命令将类似
target_link_libraries( exe1 MyLib )
关于重写编译器,请参阅如何为cmake 指定新的gcc路径
- 跨模板化函数编译的静态变量
- 无法使用 LoadObject() 函数编译 UE4 Actor。
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 函数编译,即使它不接受整数
- 使用C 模板函数编译时间递归
- 安卓 JNI - 'raw'函数编译失败
- C++就地析构函数编译警告
- 对 TR1 使用 boost 时提升数学特殊函数编译错误
- 显式复制构造函数编译错误
- 使用SSE内部函数编译一个简单的c++程序
- 函数编译时错误
- 模板函数编译错误
- C++:使用类型名作为基的模板类调用函数编译时错误
- 将 MATLAB 函数编译成可以在 linux 终端上运行的东西,w.out MATLAB
- boost::绑定不要使用成员模板函数编译
- C++函数编译错误
- 加速模板函数编译
- 如何在C++中使用辅助函数编译以下flex文件
- 如何让g++使用move构造函数编译c++11代码
- 同时将一组函数编译为.LIB和.DLL