2010-09-17 36 views
16

Tôi đang cố gắng xây dựng một đơn vị kiểm tra đơn vị thực thi đơn giản, sử dụng cpputest. Tôi đã xây dựng khung công tác cpputest thành một thư viện tĩnh và bây giờ tôi đang cố gắng liên kết nó với một tệp thực thi. Tuy nhiên, tôi bị ràng buộc vào một thiết lập Makefile khá phức tạp, vì mã liên quan.Tham chiếu không xác định cho toán tử mới

Đây là dòng lệnh của tôi:

/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm 

Tôi nhận được nhiều lỗi như sau:

Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)': 
    Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)' 

tôi không thể tìm ra những gì gây ra điều này. Tôi không nhận được toán tử mới miễn phí với C++?

+0

Thật khó để giúp dựa trên thông tin này. Cố gắng * giảm * các điều kiện cần thiết để tái tạo sự cố. Dòng lệnh trên quá phức tạp, ngay cả khi chúng ta cho rằng mã đơn giản và không làm những việc như định nghĩa lại 'toán tử mới'. –

+0

Lỗi đầu tiên có báo cáo lỗi mới của nhà điều hành không? Nếu không, lỗi đầu tiên được báo cáo là gì? –

+0

Có, các lỗi duy nhất được báo cáo là lỗi mới của nhà điều hành. Cái đó được hiển thị là cái đầu tiên. – mbyrne215

Trả lời

6

Có rất ít thông tin trong câu hỏi của bạn để làm việc từ, nhưng có vẻ như một số mã sử dụng một số hình thức vị trí mới, và trong khi đó đặc biệt operator newtuyên bố (trình biên dịch tìm thấy nó và biên dịch mã sử dụng nó), trình liên kết không thể tìm thấy định dạng của nó.

+0

Tôi không chắc chắn nên thêm thông tin nào khác. Mã thực sự đơn giản; nó không xác định lại 'mới', vì vậy tôi không thể hiểu tại sao người liên kết không thể tìm thấy nó từ thư viện chuẩn. – mbyrne215

+1

@ mbyrne215: Bạn có thể thêm mã đơn giản để tái tạo điều này. Thông báo lỗi đề cập rõ ràng một toán tử new (unsigned int, char const *, int) '(được gọi từ' CommandLineTestRunner :: parseArguments (TestPlugin *) '), rõ ràng không phải là phiên bản tiêu chuẩn của toán tử đó. – sbi

+2

Bạn nói đúng; Tôi đã rất treo lên tìm kiếm lý do tại sao libs tiêu chuẩn không làm việc, tôi đã không xem xét thông qua thư viện bên thứ 3 chặt chẽ. Đó là bí mật xác định lại mới. Tôi đã loại bỏ phần đó và tất cả đều tốt. Cảm ơn. – mbyrne215

46

Bạn có thể cần liên kết với thư viện thời gian chạy hỗ trợ C++. Điều này xảy ra tự động khi bạn gọi g ++. Trên Linux, điều này đạt được bằng cách thêm cờ -lstdC++ vào trình liên kết. Bạn phải tìm ra cách làm tương tự trên nền tảng của mình.

+0

+1, cảm ơn bạn .. – Oli

+0

đây là câu trả lời giải quyết vấn đề tôi có – yota

4

Bạn cần xây dựng lại mã của mình từ đầu, kể cả thư viện. Tôi nhận được lỗi này vì tôi vô tình sao chép các tệp đối tượng được biên dịch trên máy khác (với phần còn lại của nguồn) vào máy của tôi. Nhiều khả năng điều này làm rối loạn các bước liên kết vì hiện tại có hai loại tệp đối tượng, bản địa (đối với các tệp nguồn được sửa đổi) và không phải gốc (tất cả các tệp khác). Tôi đoán ở đây, nhưng toán tử 'mới' có nghĩa là những thứ hơi khác nhau trên các kiến ​​trúc khác nhau và đó là lý do tại sao bạn nhận được lỗi này.

p.s. Tôi biết đây là cách quá muộn cho một câu trả lời hữu ích nhưng tôi vẫn đăng bài này cho hồ sơ.

+0

trong trường hợp của tôi có một số tệp .o, từ người tiền nhiệm của tôi, để lại sau khi làm sạch mọi thứ hoạt động như một sự quyến rũ – aldr

0

Có thể bạn đang gọi gcc, trình biên dịch C thay vì g++, trình biên dịch C++.

0

Đối với QNX 6.5.0, tôi đã chỉ định cờ -lang-c++ cho qcc (gcc) để tránh lỗi.

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