CMake为MSVC 10(2010)生成项目,并且构建时间相对较低,即。在我点击给定项目的构建之后,它开始在几秒钟内编译,这是预期的。
对于Qt Creator,我选择 CodeBlocks - NMake Makefiles 作为CMake生成器,设置构建配置以使用与上面相同的目标。当我点击构建时,我看到了
cmake --build . --target name
沉默了2分钟。然后是Scanning dependencies for ...
和1.5分钟的沉默。
更糟糕的是 - 以后的编译只使用1个线程。因此,编译时间......令人无法接受。
如何配置项目以实现与MSVC下的可比较的短编译时间?我已经尝试过Qt Creator 4.3 Beta和
答案 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
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()