我正在尝试用clang 4.0设置Trevis CI。我需要C ++ 17支持。我使用以下脚本:
class CameraView: UIViewController,UIImagePickerControllerDelegate{
var session: AVCaptureSession?
var input: AVCaptureDeviceInput?
var output: AVCaptureStillImageOutput?
var previewLayer: AVCaptureVideoPreviewLayer?
override func viewDidLoad() {
super.viewDidLoad()
//Initialize session an output variables this is necessary
session = AVCaptureSession()
session?.sessionPreset = AVCaptureSession.Preset.photo;
output = AVCaptureStillImageOutput()
let camera = getDevice(position: .back)
do {
input = try AVCaptureDeviceInput(device: camera!)
} catch let error as NSError {
print(error)
input = nil
}
if(session?.canAddInput(input!) == true){
session?.addInput(input!)
output?.outputSettings = [AVVideoCodecKey : AVVideoCodecType.jpeg]
if(session?.canAddOutput(output!) == true){
session?.addOutput(output!)
previewLayer = AVCaptureVideoPreviewLayer(session: session!)
previewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
previewLayer?.frame = self.view.bounds
previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill;
cameraView.layer.addSublayer(previewLayer!)
session?.startRunning()
}
}
//Select library photo
}
//Get the device (Front or Back)
func getDevice(position: AVCaptureDevice.Position) -> AVCaptureDevice? {
let devices: NSArray = AVCaptureDevice.devices() as NSArray;
for de in devices {
let deviceConverted = de as! AVCaptureDevice
if(deviceConverted.position == position){
return deviceConverted
}
}
return nil
}
@IBOutlet weak var prendreBouton: UIButton!
@IBOutlet weak var previewImage: UIImageView!
@IBAction func takeAPicture(_ sender: Any) {
if let videoConnection = output?.connection(with:AVMediaType.video){
output?.captureStillImageAsynchronously(from:videoConnection, completionHandler: {
(sampleBuffer, error) in
let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer!)
let dataProvider = CGDataProvider.init(data: imageData! as CFData)
let cgImageRef = CGImage.init(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)
let image = UIImage.init(cgImage: cgImageRef!, scale: 1.0, orientation: .right)
// do something with image
})
}
}}
尽管成功安装了clang 4.0,但build失败并显示消息:language: cpp
sudo: required
os:
- linux
compiler:
- clang
env:
- TARGET_CPU=x86 BUILD_CONFIGURATION=Debug
- TARGET_CPU=x86 BUILD_CONFIGURATION=Release
- TARGET_CPU=x64 BUILD_CONFIGURATION=Debug
- TARGET_CPU=x64 BUILD_CONFIGURATION=Release
- TARGET_CPU=amd64 BUILD_CONFIGURATION=Debug
- TARGET_CPU=amd64 BUILD_CONFIGURATION=Release
before_install:
- sudo apt-add-repository "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-4.0 main"
- sudo apt-get update -qq
install:
- sudo apt-get install libboost-all-dev
- sudo apt-get install --allow-unauthenticated -qq clang++-4.0
- export CXX="clang++-4.0"
script:
- mkdir build
- cd build
- cmake .. -DTARGET_CPU=$TARGET_CPU -DCMAKE_BUILD_TYPE=$BUILD_CONFIGURATION
- make
。这意味着我甚至没有C ++ 11支持。
我该怎么办呢?我错过了error: no member named 'make_unique' in namespace 'std'
中的某些内容吗?
答案 0 :(得分:1)
你的Clang版本应该没问题,问题是(根据我的经验)Travis不尊重各种CMake配置。出于某种原因,根据我的经验,Travis CI似乎忽略了CMake中的CMAKE_CXX_STANDARD
变量。
例如,Travis将忽略我的CMakeLists.txt中的以下行(对于C ++ 11)。
set(CMAKE_CXX_STANDARD 11)
set(CXX_STANDARD TRUE)
如果我手动添加标记,我可以获得成功的构建:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
对于C ++ 17,您希望将其更改为set(CMAKE_CXX_STANDARD 17)
和set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z")
。
这一切都不是理想的,IMO,但它是一个可用的解决方法。