CMake和慢速MSVC编译

时间:2017-03-31 08:01:11

标签: visual-studio cmake qt-creator


CMake为MSVC 10(2010)生成项目,并且构建时间相对较低,即。在我点击给定项目的构建之后,它开始在几秒钟内编译,这是预期的。

Configuration 对于Qt Creator,我选择 CodeBlocks - NMake Makefiles 作为CMake生成器,设置构建配置以使用与上面相同的目标。当我点击构建时,我看到了 cmake --build . --target name
沉默了2分钟。然后是Scanning dependencies for ...
和1.5分钟的沉默。 更糟糕的是 - 以后的编译只使用1个线程。因此,编译时间......令人无法接受。

如何配置项目以实现与MSVC下的可比较的短编译时间?我已经尝试过Qt Creator 4.3 Beta和

3 个答案:

答案 0 :(得分:1)

CMake使用默认参数(即,对于MSVC)使用默认参数(即,使用单线程构建)调用编译器。 MSVS中的构建速度更快,因为Visual Studio使用为多处理器构建配置的设置调用编译器。

如何为import UIKit class ta1: UIViewController,UIScrollViewDelegate { var userinfo = "" var status1:Int = 111 var status2:Int = 111 @IBOutlet weak var btn: UIButton! @IBOutlet weak var sw1_1: UISwitch! @IBOutlet weak var sw1_2: UISwitch! @IBOutlet weak var sw1_3: UISwitch! @IBOutlet weak var sw2_1: UISwitch! @IBOutlet weak var sw2_2: UISwitch! @IBOutlet weak var sw2_3: UISwitch! @IBOutlet weak var scrollview: UIScrollView! @IBOutlet weak var ta1: UIImageView! @IBOutlet weak var swz: UIView! @IBOutlet weak var ewz: UIView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } func viewForZooming(in scrollView: UIScrollView) -> UIView? { return ta1 } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ @IBAction func switchViews(_ sender: UISegmentedControl) { if sender.selectedSegmentIndex == 0 { swz.alpha = 1 ewz.alpha = 0 swz.isHidden = false ewz.isHidden = true } else { swz.alpha = 0 ewz.alpha = 1 swz.isHidden = true ewz.isHidden = false } } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == "backtoselect1" ) { let bts1 = segue.destination as! select1 bts1.userinfo = self.userinfo } else if (segue.identifier == "gotocon") { let gtcon = segue.destination as! conclusion let status1Text = String(status1) let status2Text = String(status2) gtcon.userfinalinfo = self.userinfo + ",1," + status1Text + "," + status2Text } } @IBAction func swbutton1_1(_ sender: UISwitch) { if (sender.isOn == true) { status1 += 100 sw1_2.isEnabled = true sw1_3.isEnabled = true } else { status1 = 0 sw1_2.setOn(false, animated: true) sw1_3.setOn(false, animated: true) sw1_2.isEnabled = false sw1_3.isEnabled = false } print(status1) } @IBAction func swbutton1_2(_ sender: UISwitch) { if (sender.isOn == true && sw1_1.isOn != false) { status1 += 10 print(status1) } else if (sender.isOn == false && sw1_1.isOn != false) { status1 -= 10 print(status1) } } @IBAction func swbutton1_3(_ sender: UISwitch) { if (sender.isOn == true && sw1_1.isOn != false) { status1 += 1 print(status1) } else if (sender.isOn == false && sw1_1.isOn != false) { status1 -= 1 print(status1) } } @IBAction func swbutton2_1(_ sender: UISwitch) { if (sender.isOn == true) { status2 += 100 sw2_2.isEnabled = true sw2_3.isEnabled = true } else { status2 = 0 sw2_2.setOn(false, animated: true) sw2_3.setOn(false, animated: true) sw2_2.isEnabled = false sw2_3.isEnabled = false } print(status2) } @IBAction func swbutton2_2(_ sender: UISwitch) { if (sender.isOn == true && sw2_1.isOn != false) { status2 += 10 print(status2) } else if (sender.isOn == false && sw2_1.isOn != false) { status2 -= 10 print(status2) } } @IBAction func swbutton2_3(_ sender: UISwitch) { if (sender.isOn == true && sw2_1.isOn != false) { status2 += 1 print(status2) } else if (sender.isOn == false && sw2_1.isOn != false) { status2 -= 1 print(status2) } } } 或其他cmake generators使用多处理器构建?

添加-jn option for gcc编译器:

CodeBlocks - NMake Makefiles

/m for MSVC

cmake --build . --target name -- -j4

对于MSVS 2017或更高版本,可以使用-m form代替cmake --build . --target name -- /m 。另外,您可以指定在构建/m时要使用的最大并发进程数。

答案 1 :(得分:0)

NMake和NMake JOM很慢。 当我改为Ninja构建系统时 - 编译时间与MSVC内部类似。

答案 2 :(得分:0)

默认情况下,CMake不是多处理器构建。所以由你决定强迫它......

使用cmake配置项目时,可以指定/MP标志。

cmake -G "<MSVC-Generator>" -DCMAKE_CXX_FLAGS="/MP" <target_dir>

我为CMakeLists.txt文件中的所有cmake项目执行此操作,因此客户端不必:

if(MSVC)
 target_compile_options(<target> PRIVATE "/MP")
endif()