如何在Travis CI上安装clang with C ++ 17?

时间:2017-07-20 23:28:15

标签: c++ travis-ci c++17 clang++

我正在尝试用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'中的某些内容吗?

1 个答案:

答案 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,但它是一个可用的解决方法。