2011-11-02 39 views
5

Tôi hiện đang cố gắng để có được một chương trình biên dịch trên một hệ thống mà tôi không có quyền kiểm soát.Ghi đè đường dẫn tìm kiếm tiêu đề mặc định

Vấn đề mà tôi đang gặp là các thư mục bao gồm trông như thế này:

/usr/include: 
gmpxx.h gmp.h 

/usr/local/include: 
gmp.h 

Trong tập tin cpp của tôi, tôi sử dụng

#include <gmpxx.h> 

và điều này tìm thấy tập tin chính xác trong /usr/include, tuy nhiên khi gmpxx.h bao gồm gmp.h, nó kéo nó từ /usr/local/include, phá vỡ cấu trúc.

Ngay bây giờ, tôi thấy 3 giải pháp rất xấu xí cho vấn đề

  1. Trong tập tin cpp của tôi, thêm #include </usr/include/gmp.h>
    Có một tuyệt đối bao gồm đường dẫn là khá xấu xí và không cầm tay, và tôi nghĩ rằng điều này loại điều nên thuộc về Makefile thay vì nguồn.

  2. thêm -nostdinc cờ để makefile của tôi, và chỉ định đường dẫn bao gồm bằng tay

  3. tạo liên kết tượng trưng địa phương để các thư viện mà tôi thực sự muốn, và sau đó làm địa phương bao gồm (#include "gmp.h")

Có giải pháp nào tốt hơn mà tôi bị thiếu không?

+0

bạn có được phép sửa đổi gmpxx.h không? –

+0

Tôi không phải là điều duy nhất tôi có thể thay đổi là các tệp cục bộ (cpp, makefile) – cobbal

+0

# 2 có nhiều ý nghĩa. Makefile hiển thị cách xây dựng tệp. Hai người khác dường như bị hack. –

Trả lời

12

đường dẫn Việc tìm kiếm bao gồm được lấy theo thứ tự sau:

Vì vậy, bạn có thể sử dụng một trong hai loại đầu tiên (tùy theo điều kiện nào tốt hơn/thuận tiện hơn cho mục đích của bạn).

+0

Tôi chưa thử CPLUS_INCLUDE_PATH, nhưng vấn đề với -I là nếu bạn cho nó một thư mục trong các giá trị mặc định tiêu chuẩn, nó bỏ qua thứ tự và không đặt nó trước. – cobbal

+0

@cobbal: Tôi thấy những gì bạn đang nói; vâng, điều đó được đề cập trong tài liệu tôi liên kết đến. Nó đề cập đến hai cách giải quyết: '-nostdinc' (mà bạn đã biết, và thấy xấu xí - điều mà tôi đồng ý với bạn) và' -isystem' (xem http://gcc.gnu.org/onlinedocs/ gcc-4.3.2 // gcc/Preprocessor-Options.html). – ruakh

+0

Có vẻ như CPLUS_INCLUDE_PATH chính xác là những gì cần thiết. Cảm ơn – cobbal

0

Xóa gmp.h khỏi/usr/local/include hoặc tìm hiểu lý do bạn có phân phối phần mềm muốn có gmp.h trong/usr/local/include và xóa phân phối. Tôi nghĩ rằng vấn đề là do bạn có một số lý do hai tập tin tiêu đề xung đột đặt cho GMP. Nếu bạn có cài đặt chuẩn các tệp phát triển GMP trên hệ thống của bạn (/ usr/include/...) thì không nên có lý do để có một bộ tiêu đề khác trong/usr/local/include /.

Không có cách nào sạch để sửa chữa nó bằng cách khác, bởi vì bạn nên bao gồm gmpxx.h sử dụng dấu ngoặc nhọn

#include <gmpxx.h> 

như bạn làm. Bây giờ gmpxx.h bao gồm gmp.h bằng cách sử dụng dấu ngoặc nhọn cũng có, và trên hệ thống của bạn/usr/local/include được ưu tiên hơn/usr/include, có nghĩa nào hợp lý.

Vì vậy, tôi khuyên bạn nên tìm hiểu lý do tại sao có hai gmp.h và loại bỏ giả mạo. Có một cái gì đó fishy trong thiết lập tập tin tiêu đề của bạn.

Bạn không thể dễ dàng thay đổi/usr/include và/usr/local/include vì chúng được coi là hệ thống bao gồm các thư mục và nếu bạn cố gắng sử dụng -Tôi trên chúng, GCC sẽ bỏ qua tùy chọn.

+1

Trong khi điều này chắc chắn sẽ là lý tưởng, tôi không thể thực sự sửa đổi các tiêu đề vì nó là một máy tính trường học. Vì tôi không thể làm điều này, tôi sẽ làm việc sạch sẽ nhất. – cobbal

+0

LOL lý do chính đáng :) –

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