2009-02-21 26 views
9

Tôi đang chuyển một ứng dụng được viết bằng C++ từ Windows sang Linux. Tôi gặp sự cố với đường dẫn tệp tiêu đề. Windows sử dụng \ và Linux sử dụng /. Tôi đang tìm thấy nó cồng kềnh để thay đổi điều này trong mỗi và tất cả các nguồn và tập tin tiêu đề. Có một số công việc xung quanh?Bao gồm thay đổi đường dẫn tiêu đề từ Windows sang Linux

+13

Khi bạn cuối cùng khắc phục điều đó, hãy nhớ: NEVER EVER sử dụng dấu xồ nguợc. Chuyển tiếp slashes làm việc cả trong Windows và Linux. –

Trả lời

26

Luôn sử dụng dấu gạch chéo về phía trước trong #include đường dẫn. Đây là công việc của trình biên dịch để ánh xạ đường dẫn tới bất kỳ lược đồ slash/directory nào mà hệ điều hành bên dưới hỗ trợ.

+13

-1. IMHO bạn đang trả lời câu hỏi sai - anh chàng đã có một đống tệp với các đường dẫn #include bị gạch chéo ngược. Anh cần xe cứu thương, không phải ai đó nói với anh rằng anh không nên lái quá nhanh. –

+0

Câu hỏi hay! Tôi đoán anh ta có nghĩa là anh ta muốn tránh liên tục phải trao đổi giữa/và \ khi anh ấy di chuyển giữa các dự án. (OP bạn có thể làm rõ xin vui lòng?) Giảm -1 của tôi kể từ khi rõ ràng ý kiến ​​của OP về những gì OP muốn outranks của tôi :) –

+0

@j_random_hacker Họ đang porting (ít nhất, ông là khi câu hỏi được viết) vì vậy họ vẫn còn lái xe và vẫn chưa sụp đổ. Lật hướng của các dấu gạch chéo trong các tệp của chúng là một câu lệnh perl duy nhất. –

4

Bạn đang sử dụng phiên bản Windows nào? Theo như tôi biết, bắt đầu với Windows XP, các dấu gạch chéo chuyển tiếp thực sự hoạt động như các dấu phân cách đường dẫn.

+1

Tôi nghĩ rằng OP đang chuyển từ Windows sang Linux, không phải Linux sang Windows –

+0

thực sự là ứng dụng được mã hóa cho các nền tảng khác nhau. Và tôi đang sử dụng các tập tin được mã hóa bởi người khác. Tôi quan tâm để biết liệu có một cách dễ dàng hơn để thay đổi dấu gạch chéo ngược để chuyển tiếp dấu gạch chéo hoặc nhận được một số hiệu ứng tương tự. –

5

Luôn sử dụng dấu gạch chéo chuyển tiếp trong #include chỉ thị. Một số hệ điều hành/trình biên dịch yêu cầu nó, và Windows/Visual Studio là đủ thông minh để xử lý nó một cách chính xác.

Kể từ khi bắt đầu với mã Windows, tôi giả định rằng bạn có Visual Studio. Sử dụng hộp thoại tìm và thay thế và tạo cụm từ thông dụng sẽ thực hiện thay thế cho bạn. Chạy tìm và thay thế trên tất cả các tệp.

Ví dụ, sử dụng một cái gì đó như thế này:

#include:b+<{[^\\\>]}\\ 

cho biểu hiện tìm kiếm và

#include <\1 

cho sự biểu hiện thay thế (cảnh báo: chưa được kiểm tra). Chạy điều này trên tất cả các tệp cho đến khi không có thay thế nào được thực hiện. Sau đó chuyển các dấu ngoặc nhọn sang dấu ngoặc kép và lặp lại.

7

API Windows có luôn là dấu gạch chéo được hỗ trợ làm dấu tách thư mục. Và đó là bởi vì như xa trở lại như ít nhất là DOS 3.1 nó cũng được hỗ trợ. Vấn đề luôn là COMMAND.COM và CMD.EXE. Họ sử dụng dấu gạch chéo về phía trước làm chỉ báo tùy chọn (thay vì dấu gạch ngang như được tìm thấy trong Unix). Không bao giờ sử dụng dấu gạch chéo ngược cho dấu tách thư mục trong các ngôn ngữ mà dấu gạch chéo ngược trong chuỗi được sử dụng để thoát khỏi các ký tự đặc biệt.

Nếu bạn thiếu trình bao Unix, bạn có trình chỉnh sửa nào tìm kiếm/thay thế trên nhiều tệp không? Heck, viết một chương trình nhỏ để làm điều đó nếu bạn có. Việc phân tích mã nguồn C++ cho các câu lệnh #include của nó không thể khó.

+1

Nó không luôn luôn hỗ trợ dấu gạch chéo phía trước là một vấn đề lớn đối với lứa tuổi. Nhưng nó hiện nay. –

+2

Ít nhất là trở lại với DOS 4.0 nó đã làm. – jmucchiello

+0

joe: chắc chắn là không đúng. Các trình biên dịch có thể đã hỗ trợ nó cho bao gồm, và giao diện người dùng Explorer chắc chắn đã làm. Nhưng WinAPI nói chung thì không. –

10

Bạn là người! , bạn có thể, và nên, luôn luôn sử dụng dấu gạch chéo về phía trước. Tôi nghĩ rằng vấn đề là cách nhận được tại đó từ tại đây!

Nếu bạn đã Perl được cài đặt, lót dưới đây sẽ chuyển đổi một C tập tin nguồn ++ sử dụng phía trước dấu gạch chéo, tiết kiệm với phiên bản gốc trong một tập tin với phần mở rộng .bak:

perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" myfile.cpp 

(Dòng lệnh trên là dành cho Windows, nếu bạn đang sử dụng Linux hoặc hệ vỏ giống Unix khác, hãy sử dụng dấu nháy đơn xung quanh thông số thứ 3 thay vì dấu ngoặc kép.)

Nếu bạn có một loạt các dữ liệu mà bạn cần phải chuyển đổi, nói tất cả các file có đuôi .cpp:

for %f in (*.cpp) do perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" %f 

Lệnh tương ứng cho một môi trường shell Bourne (điển hình Linux shell):

for f in *.cpp; do perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' $f; done 

Nếu bạn chưa cài đặt Perl, bạn sẽ có thể tìm thấy trình chỉnh sửa văn bản cho phép tìm kiếm và thay thế trên các tệp.

+1

Bạn có thể muốn sử dụng dấu tách khác với! nếu bạn đang sử dụng tcsh. –

+0

@mrree: Tốt. Ngoài ra, bạn sẽ cần phải thay đổi cú pháp của vòng lặp cho phần nào (tôi quên cú pháp chính xác không may). –

+0

foreach f (* .cpp) .... end; Tôi không nghĩ rằng bạn có thể làm tất cả trên một dòng ... –

0

Bạn có thể thử lệnh này dựa trên lệnh perl trước đây làm công việc recusrively

find . -type f -name \* | xargs grep '#include' | grep '\\' |awk -F: '{print $1}'|sort| uniq | xargs -n1 perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' 
Các vấn đề liên quan