ฉันจะรวบรวม C ++ ด้วย Clang ได้อย่างไร


99

ฉันติดตั้งClangโดยใช้ apt-get ใน Ubuntu และฉันสามารถรวบรวมไฟล์ C ได้สำเร็จโดยใช้มัน อย่างไรก็ตามฉันไม่รู้ว่าจะรวบรวม C ++ ผ่านมันได้อย่างไร ฉันต้องทำอะไรเพื่อรวบรวม C ++

คำตอบ:



54

ฉันไม่ทราบว่าเหตุใดจึงไม่มีคำตอบในการแก้ไขปัญหาโดยตรง เมื่อคุณต้องการที่จะรวบรวมโปรแกรม C ++ clang++ที่ดีที่สุดคือการใช้งาน ตัวอย่างเช่นสิ่งต่อไปนี้ใช้ได้กับฉัน:

clang++ -Wall -std=c++11 test.cc -o test

หากคอมไพล์ถูกต้องมันจะสร้างไฟล์ปฏิบัติการtestและคุณสามารถเรียกใช้ไฟล์โดยใช้./test.

หรือคุณสามารถใช้clang++ test.ccเพื่อคอมไพล์โปรแกรม a.outมันจะผลิตแฟ้มที่ปฏิบัติการเริ่มต้นชื่อ ใช้./a.outเพื่อเรียกใช้ไฟล์

กระบวนการทั้งหมดเหมือนกับ g ++ ถ้าคุณคุ้นเคยกับ g ++ ดูโพสต์นี้เพื่อตรวจสอบว่ามีคำเตือนใดบ้าง-Wallบ้างที่ตัวเลือก หน้านี้แสดงรายการของแฟล็กการวินิจฉัยที่สนับสนุนโดย Clang

หมายเหตุเกี่ยวกับการใช้clang -x c++ : Kim Gräsmanกล่าวว่าคุณสามารถใช้ clang -x c++เพื่อรวบรวมโปรแกรม cpp ได้ แต่อาจไม่เป็นความจริง ตัวอย่างเช่นฉันมีโปรแกรมง่ายๆด้านล่าง:

#include <iostream>
#include <vector>

int main() {
    /* std::vector<int> v = {1, 2, 3, 4, 5}; */
    std::vector<int> v(10, 5);
    int sum = 0;
    for (int i = 0; i < v.size(); i++){
        sum += v[i]*2;
    }
    std::cout << "sum is " << sum << std::endl;
    return 0;
}                                                      

clang++ test.cc -o testจะคอมไพล์สำเร็จ แต่clang -x c++จะไม่แสดงข้อผิดพลาดในการอ้างอิงที่ไม่ได้กำหนดจำนวนมาก ดังนั้นฉันเดาว่ามันไม่เทียบเท่ากันแน่ ๆ ที่ดีที่สุดคือใช้clang++แทนclang -x c++เมื่อคอมไพล์โปรแกรม c ++ เพื่อหลีกเลี่ยงปัญหาเพิ่มเติม

  • เวอร์ชันเสียงดัง: 11.0.0
  • แพลตฟอร์ม: Ubuntu 16.04

5
ขอบคุณที่ตอบคำถามจริงๆ
Curyous

51

นอกจากนี้สำหรับลูกหลาน - เสียงดัง (เช่น GCC) ยอมรับ-xสวิตช์เพื่อตั้งค่าภาษาของไฟล์อินพุตตัวอย่างเช่น

$ clang -x c++ some_random_file.txt

เธรดรายชื่ออีเมลนี้อธิบายความแตกต่างระหว่างclangและclang++ดี: ความแตกต่างระหว่างเสียงดังและเสียงดัง ++


5
ฉันมีข้อผิดพลาด linker กับclang -x c ++เมื่อคอมไพล์ไฟล์ cpp ด้วย#include <iostream>. แฟล็ก -lstdc ++แก้ปัญหานี้ได้
Slav

1
ฉันมีซอร์สโค้ดของเสียงดังต่อหน้าต่อตาตอนนี้ ในระหว่างการสร้าง (บน Windows) จะสร้างก่อนclang.exeแล้วจึงคัดลอกสิ่งที่เรียกใช้งานได้ไปclang++.exeยัง ดังนั้นมันจึงเป็นไฟล์ปฏิบัติการเดียวกันในขณะรันไทม์มันจะตรวจสอบชื่อของตัวเองเพื่อแยกแยะว่าจะทำงานเป็นคอมไพเลอร์ C หรือ C ++ HTH.
Serge Rogatch

เป็นบันทึกตัวเลือกที่-x c++มีประโยชน์มากที่จะให้เป็น-extra-argไปเสียงดังกราว-เป็นระเบียบเรียบร้อยเพื่อบังคับให้รักษาไฟล์ .h ว่ามี C ++ แทนซี
โฆษณา N

สิ่งนี้ จำกัด เกินไปที่จะเป็นประโยชน์จริง ๆ เว้นแต่คุณจะสร้างทั้งสิ่งจากแหล่งที่มา จะดีกว่าแค่ใช้clang++และปล่อยให้มันตรวจจับประเภทของไฟล์ที่คุณให้มา เมื่อโครงการสามารถมี.cppไฟล์.llไฟล์ (LLVM IR) และ.o, .a, .soและสิ่งที่ไม่ไฟล์จากห้องสมุดของบุคคลที่สามclang -x c++ก็จะโยนขึ้น
Sahsahae

ฉันยังเห็นปัญหาเดียวกันกับ @Slav สำหรับโปรแกรมที่เรียบง่ายใช้clang++งานได้ แต่clang -x c++แสดงข้อผิดพลาดในการอ้างอิงที่ไม่ได้กำหนดจำนวนมาก (แฟล็กอื่นเหมือนกัน) clang++ดังนั้นผมคิดว่าดีที่สุดคือการใช้งาน ทดสอบเสียงดังเวอร์ชัน: 11.0.0
jdhao

5

ฉันมีปัญหาคล้ายกันเมื่อสร้าง Clang จากซอร์ส (แต่ไม่ใช่ด้วยsudo apt-get installซึ่งอาจขึ้นอยู่กับเวอร์ชันของ Ubuntu ที่คุณใช้งานอยู่)

คุณควรตรวจสอบว่าclang++สามารถค้นหาตำแหน่งที่ถูกต้องของไลบรารี C ++ ของคุณได้หรือไม่:

เปรียบเทียบผลลัพธ์ของg++ -v <filename.cpp>และclang++ -v <filename.cpp>ภายใต้ "#include <... > การค้นหาเริ่มต้นที่นี่:"



0

เปิดหน้าต่าง Terminal และไปที่ไดเรกทอรีโครงการของคุณ รันชุดคำสั่งเหล่านี้ขึ้นอยู่กับคอมไพเลอร์ที่คุณติดตั้ง:

ในการคอมไพล์ไฟล์ C ++ หลายไฟล์โดยใช้ clang ++:

$ clang++ *.cpp 
$ ./a.out 

ในการรวบรวมไฟล์ C ++ หลายไฟล์โดยใช้ g ++:

$ g++ -c *.cpp 
$ g++ -o temp.exe *.o
$ ./temp.exe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.