2010-09-27 34 views
5

Tôi là người mới lập trình bằng C++ với các tệp tiêu đề. Đây là mã hiện tại của tôi:cách liên kết các tệp tiêu đề bằng C++

//a.h 
#ifndef a_H 
#define a_H 
namespace hello 
{ 
    class A 
    { 
    int a; 
    public: 
     void setA(int x); 
     int getA(); 
    }; 
} 
#endif 

//a.cpp 
#include "a.h" 
namespace hello 
{ 
    A::setA(int x) 
    { 
    a=x; 
    } 
    int A::getA() 
    { 
    return a; 
    } 
} 

//ex2.cpp 
#include "a.h" 
#include<iostream> 
using namespace std; 

namespace hello 
{ 
    A* a1; 
} 
using namespace hello; 
int main() 
{ 
    a1=new A(); 
    a1->setA(10); 
    cout<<a1->getA(); 
    return 1; 
} 

Khi tôi cố gắng biên dịch nó với g++ ex2.cpp, tôi nhận được lỗi này:

In function `main': 
ex2.cpp:(.text+0x33): undefined reference to `hello::A::setA(int)' 
ex2.cpp:(.text+0x40): undefined reference to `hello::A::getA()' 
collect2: ld returned 1 exit status 

Tại sao không cho nó hoạt động, và làm thế nào tôi có thể sửa chữa nó?

+0

Vui lòng sử dụng mã nguồn tính năng định dạng, nhấp vào biểu tượng "101 010" trong trình chỉnh sửa. – mikerobi

+1

Bạn đã quên 'void' trước« A :: setA' trong tệp a.cpp của bạn. –

Trả lời

2

Hiện tại bạn đang biên soạn và chỉ liên kết ex2.cpp nhưng tập tin này có tận dụng def lớp và chức năng gọi hiện diện trong a.cpp vì vậy bạn cần phải biên dịch và liên kết a.cpp cũng như:

g++ ex2.cpp a.cpp 

Lệnh trên sẽ biên dịch tệp nguồn (.cpp) thành tệp đối tượng và liên kết chúng để cung cấp cho bạn tệp thực thi a.out.

23

Bạn không liên kết tệp tiêu đề. Bạn liên kết các tệp đối tượng, được tạo bằng cách biên dịch .cpp tệp. Bạn cần biên dịch tất cả các tệp nguồn của bạn và chuyển các tệp đối tượng kết quả tới trình liên kết.

Từ thông báo lỗi có vẻ như bạn đang sử dụng GCC. Nếu có, tôi nghĩ bạn có thể làm
g++ ex2.cpp a.cpp
để biên dịch cả hai tệp .cpp và gọi trình liên kết với các tệp đối tượng kết quả.

+8

+1 cho 'Bạn không liên kết tệp tiêu đề'. :) –

8

Bạn cần phải biên dịch và liên kết cả file nguồn, ví dụ:

g++ ex2.cpp a.cpp -o my_program 
3

Bạn cần phải biên dịch và sau đó liên kết cả hai nguồn (.cpp) file:

g++ -Wall -pedantic -g -o your_exe a.cpp ex2.cpp 
+1

Tôi có thể đề xuất '-Werror' nữa không :)? –

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