2013-01-16 45 views
5

tôi có một dự án C++ lớn, với các tệp nguồn được tổ chức trong nhiều thư mục (trên hệ thống tệp).Dự án VisualStudio với nhiều tệp nguồn cùng tên?

trong hai thư mục này, tôi có các tệp có cùng tên. ví dụ:

\MyProject\foo\Blurp.cpp 
\MyProject\foo\File.cpp 
\MyProject\bar\File.cpp 
\MyProject\bar\Knoll.cpp 

dự án là nền tảng chéo, và tôi sử dụng autoconf trên Linux và OSX, nhưng phải sử dụng MSVC trên W32 (do một số bên thứ 3 C++ thư viện tôi sử dụng trên W32 và C++ không tương thích giao diện nhị phân trên các trình biên dịch)

ở phía MSVC, dự án được tổ chức thành nhiều "Bộ lọc" (các Thư mục ảo đó) (với tên tương ứng với Thư mục các tệp đang sống), vì vậy tôi có thể phân biệt chúng.

bây giờ vấn đề là, khi tôi xây dựng dự án, MSVC đặt các tập tin đối tượng trong một diretory phẳng duy nhất, và tôi kết thúc với:

\MyProject\Release\Blurp.obj 
\MyProject\Release\File.obj 
\MyProject\Release\Knoll.obj 

như có thể thấy, chỉ có một File.obj là, vì vậy một đối tượng nhị phân bị thiếu. rõ ràng, trình liên kết than phiền, vì nó không thể tìm thấy các lớp/hàm/... được định nghĩa trong tệp đối tượng bị thiếu đó.

có cách nào để thông báo cho MSVC tạo tệp đối tượng có tên duy nhất tùy thuộc vào thư mục (hoặc bộ lọc) các tệp đó nằm trong không?

tôi tưởng tượng cái gì đó như:

\MyProject\Release\foo\Blurp.obj 
\MyProject\Release\foo\File.obj 
\MyProject\Release\bar\File.obj 
\MyProject\Release\bar\Knoll.obj 

hoặc

\MyProject\Release\foo-Blurp.obj 
... 

hoặc bất cứ điều gì. tất cả các hệ thống xây dựng khác mà tôi biết (CMake, autotools) có thể xử lý nhiều tệp cùng tên.

câu hỏi này tương tự như 3729515, nhưng tôi hiện đang bị kẹt với VS2008. (giải pháp được đề xuất ở đó cho VS2008 - để đặt Object-Directory cho mỗi tệp được đề cập - là thứ thực sự hoạt động theo lý thuyết, nhưng tôi muốn tránh các lý do thực tế)

Trả lời

6

Bạn có thể đặt tệp - cụ thể thiết lập dự án cho một (hoặc cả hai) của các tập tin mà xung đột và thiết lập các "Object file Name" tài sản để:

$(InputDir)\$(IntDir)\ 

Chỉ cần kích chuột phải vào tên tập tin thay vì tên dự án để thiết lập thuộc tính cho điều đó chỉ tệp.

Ví dụ: nếu bạn làm điều đó cho \MyProject\foo\File.cpp thì tệp đối tượng cho tệp nguồn đó sẽ chuyển đến \MyProject\foo\Release\File.obj để nó không xung đột với tệp đối tượng cho \MyProject\bar\File.cpp. Những hạn chế của việc này là nó có thể làm lộn xộn cây nguồn của bạn với kết quả đầu ra của trình biên dịch (nhưng hy vọng không có quá nhiều), và - thậm chí tệ hơn - các thiết lập dự án tập tin cụ thể có xu hướng bị lãng quên/ẩn vì chúng không được gọi trong IDE chút nào. Nếu đôi khi xuống đường bạn (hoặc người khác) cần phải thay đổi mọi thứ, có thể là một điều bí ẩn về lý do tại sao việc xây dựng hoạt động lạ thường đối với các tệp cụ thể cho đến khi ai đó xoay vòng với nó trong nửa ngày cho đến khi nó diễn ra trên.

Cá nhân tôi muốn thiết lập toàn bộ dự án là $(InputDir)\$(IntDir)\ sẽ khiến tệp đối tượng chuyển đến thư mục liên quan đến tệp nguồn, nhưng nó thực sự không hoạt động tốt như cài đặt cấp dự án. Trong trường hợp đó VS vẫn chỉ thiết lập thư mục đầu ra một lần và nó kết thúc là tương đối với tệp nguồn đầu tiên trong danh sách. Sau đó, mối liên kết bị nhầm lẫn về nơi nó sẽ tìm kiếm các tập tin đối tượng.

+0

cảm ơn đầu vào; $ (InputDir) \ $ (IntDir) \ có vẻ hứa hẹn, và/nhưng tôi thực sự muốn có một thiết lập dự án (vì những lý do được chỉ ra), tốt nhất là ngay cả trong một bảng tính, do đó thay đổi trở nên rõ ràng. Tôi không phải là rất quan tâm đến các tập tin obj lộn xộn cây nguồn của tôi (mặc dù trong tổng số có một số hàng trăm tập tin obj tạo ra) –

+0

Vâng, giải pháp này đã không làm việc cho tôi. Tôi đã nhận lỗi về một cái gì đó về "không thể tìm thấy con đường bla bla bla". Vì vậy, tôi đã đưa ra một giải pháp: Tôi loại trừ "fileWithSameName.cpp" từ giải pháp của tôi, và thêm một số khác, "AnotherFile.cpp" bên trong có dòng duy nhất: [include "fileWithSameName.cpp"]. Nó làm việc cho tôi – Illidan

+3

Điều này không làm việc cho tôi trong VS 2015. Nhưng giá trị tài sản hơi khác nhau được đề xuất tại https://stackoverflow.com/questions/3695174/visual-studio-2010s-strange-warning-lnk4042/3731643# 3731643 không hoạt động: $ (IntDir) /% (RelativeDir)/ – peastman

8

Có lẽ bạn có thể thiết lập rộng 'tên tập tin đối tượng' dự án (Configurtion Properties-> C/C++ -> Output Files) để

$(IntDir)%(RelativeDir) 

trong đó sử dụng thư mục nguồn tương đối của các tập tin nguồn. Lưu ý %, nhưng điều này sẽ trở nên xấu nếu tệp nguồn của bạn nằm ngoài thư mục dự án của bạn, có chứa ..\

+1

Thực ra bạn cần dấu tách và tên tệp ở cuối. Điều này giải quyết nó cho tôi: $ (IntDir) \% (RelativeDir) \% (Tên tệp) .obj – Rudi

+0

Cảm ơn bạn! Làm việc như một sự quyến rũ. –

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