2014-12-12 22 views
5

Tôi mới vào Xcode và khi tôi xây dựng đoạn mã sau (một MWe), tôi nhận được lỗi sauBiểu tượng Xcode C++ :: Duplicate cho Kiến trúc x86_64

ld: 3 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Tôi có ba tác phẩm như sau;

main.cpp

#include "B.cpp" 
int main() { 
    square(5); 
    return 0; 
} 

B.cpp

#include "A.cpp" 

void square(int n){ 
    display(n*n); 
} 

A.cpp

#include <iostream> 
using namespace std; 

void display(int num){ 
    cout<<num; 
} 

Tôi đã thử phương pháp khác nhau được đề cập trên stack overflow như biến đổi "Xây dựng tích cực Kiến trúc Chỉ" thành "Có" và một số người khác nhưng lỗi vẫn vẫn tồn tại.

Trả lời

10

Vấn đề là main.cpp đã bao gồm B.cppA.cpp. Trong quá trình xây dựng, bạn cũng đang biên dịch B.cppA.cpp và cố gắng liên kết B.oA.o cùng với main.o.

Liên kết B.oA.o làm cho các ký hiệu displaysquare được xác định nhiều lần. display được xác định 3 lần và square được xác định 2 lần.

Bạn chỉ cần biên dịch và xây dựng main.cpp. Không xây dựng A.cppB.cpp.

Second cách là làm cho A.cppB.cpp-A.hB.h và chức năng inline. Vì vậy, chúng sẽ chỉ được biên dịch một lần.

Thứ ba cách, không bao gồm B.cpp trong main.cpp. Chỉ cần đặt khai báo hàm thay vì đưa vào.

//main.cpp 

void square(int); 

int main() { 
    square(5); 
    return 0; 
} 

Nói chung, khai báo hàm được đặt trong tệp tiêu đề. Nếu điều đó là bắt buộc trong nhiều trường hợp, hãy tạo một tệp tiêu đề.

+0

Cảm ơn bạn đã đề xuất, tôi đã thử theo cách sau nhưng lỗi vẫn tồn tại. 1. Vệ sinh dự án. 2. Chọn "Main.cpp" 3. Sản phẩm -> Thực hiện Hành động -> Biên dịch "Main.cpp" 4. Lặp lại Bước 3, cho "A.cpp" và "B.cpp" 5. Chạy Dự án . 6. Có lỗi tương tự. Tôi cũng đã cố gắng biên dịch chỉ "Main.cpp" và sau đó chạy nhưng XCode xây dựng dự án hoàn chỉnh.
Bạn có thể giải thích cách biên dịch và xây dựng "Main.cpp" một cách độc lập không. P.S. Tôi đang sử dụng XCode 6.1.1 – Ahmad

+0

@Ahmad bạn vẫn không nhận được nó. Bạn đang bao gồm cùng một nguồn trong ** hai đơn vị dịch khác nhau **. Mã trong 'A.cpp' được biên dịch thành một đơn vị dịch đơn thành' Ao', sau đó * cùng mã * là '# include'-ed thành' main.cpp' (đó là vấn đề ** thực **) . Lựa chọn thứ hai trong câu trả lời này là lý tưởng. Làm việc đó đi. – WhozCraig

+0

@WhozCraig Cảm ơn bạn. Tôi đã sử dụng tùy chọn thứ hai, giải quyết được sự cố. – Ahmad

Các vấn đề liên quan