2010-01-06 30 views
16

Tôi đã trải qua một số bài viết về Stack Overflow đã trả lời câu hỏi "Làm thế nào để chuyển các định nghĩa tiền xử lý tới trình biên dịch từ dòng lệnh MSBuild ", và tất cả họ đều trả lời với một số biến thể của:MSBuild.exe không chấp nhận một trong hai/p: DefineConstants và/p: PreprocessorDefinitions

MSBuild.exe /p:DefineConstants=THING_TO_BE_DEFINED 

tôi đã thử mọi biến thể mà tôi có thể đưa ra:

MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED" 
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED" 
MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED=1" 
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED=1" 

... và hàng chục người khác. Tôi cũng đã tán tỉnh với PreprocessorDefinitions ghi đè theo những cách tương tự. Tất cả chúng đã kích hoạt #error bên dưới:

#include "stdafx.h" 

#if !defined(THING_TO_BE_DEFINED) 
#error "THING_TO_BE_DEFINED is not defined" 
#endif 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

Tôi đã thử điều này bằng ứng dụng dòng lệnh đơn giản ở trên, cũng như với một dự án trò chơi lớn mà tôi có ở đây. Tôi chỉ có thể đoán rằng Visual Studio (tôi thấy điều này với 2005 và 2008) có một số thiết lập mặc định sâu trong ruột của nó đang ngăn cản đối số dòng lệnh của tôi không được áp dụng, nhưng tôi đã không tìm thấy bằng chứng để hỗ trợ giả thuyết này.

Bất kỳ ý tưởng nào về cách tôi có thể làm việc này? Tại sao trong tên của FSM họ không dính với tốt ol '-D THING_TO_BE_DEFINED?

Trả lời

7

Nếu bạn đang gọi MSBuild trên dòng lệnh, bạn không thể chỉ định giá trị cho DefineConstants. Nhưng nếu bạn đang xây dựng một .csproj, hoặc một kịch bản MSBuild khác, thì bạn có thể chỉ định nó. Nếu bạn tạo một tệp msbuild để "thay thế" tệp giải pháp của bạn thì bạn có thể sử dụng tệp đó để chỉ định giá trị cho điều đó khi bạn tạo dự án của mình. Ví dụ:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <!-- Default value here --> 
    <DefineConstants Condition=" '$(DefineConstants)'==''" >DEBUG;TRACE</DefineConstants> 
    </PropertyGroup> 

    <ItemGroup> 
    <Projects Include="one.csproj" /> 
    <Projects Include="two.csproj" /> 
    </ItemGroup> 

    <Target Name="Build"> 
    <MSBuild Projects="@(Projects)" 
       Properties="DefineConstants=$(DefineConstants)"/> 
    </Target> 
</Project> 

Sau đó, bạn có thể sử dụng msbuild.exe buid.proj /p:DefineConstants="YourValue;Debug;Trace"

Lưu ý việc sử dụng dấu ngoặc kép trên dòng lệnh.

Tôi đã viết một bài đăng trên blog một thời gian về một điều gì đó liên quan đến điều này tại http://sedodream.com/2008/05/07/MSBuildBuildingTheSameProjectMultipleTimes.aspx.

+2

Tôi bị mắc kẹt với .vcproj mà nhà phát triển đưa cho tôi. Doh. – Sniggerfardimungus

6

Nếu bạn muốn xác định TRACE & Constants DEBUG này nên làm việc:

msbuild mysln.sln /t:Rebuild /p:Configuration=Release /p:DefineConstants="DEBUG;TRACE" 
+4

Câu trả lời được chấp nhận thực sự không chính xác. Tôi đã tìm thấy các dự án của riêng mình, mà DefineConstants bị bỏ qua, trừ khi tôi sử dụng tùy chọn/t: Rebuild. –

+4

Công trình này hoạt động, nhưng nó TĂNG TRÊN biến '$ (DefineConstants)' hiện tại - cho MỌI DỰ ÁN trong giải pháp! - Tôi chỉ muốn nối thêm vào nó! – BrainSlugs83

1

Để hoàn chỉnh, đây là những gì tôi thấy làm việc khi tôi muốn THING_TO_BE_DEFINED="VALUE WANTED", cho VB.NET, và msbuild phiên bản 3.5.30729.1, trong một tập tin batch:

@msbuild /t:Rebuild /p:Configuration=Release;Platform="Any CPU"; 
DefineConstants="THING_TO_BE_DEFINED=\"VALUE WANTED\"" mysln.sln 

(trên cùng một dòng dĩ nhiên)

+1

+1 Cảm ơn bạn rất nhiều! Bạn là người duy nhất đề cập đến cách thoát khỏi dấu ngoặc kép để xác định Chuỗi. – Arnaud

2

các dưới đây là cần thiết sửa đổi để vcxproj cho/p để làm việc.

đặt < DefineConstants> </DefineConstants>

dưới < PropertyGroup Label = Globals>

< PreprocessorDefinitions> $ (DefineConstants); Win32; _DEBUG ; _CONSOLE; UNIT_TEST_SIM;% (PreprocessorDefinitions)

Bằng cách này MSBuild sẽ biết rằng dùng cho preprocessor nó cần phải sử dụng các giá trị từ các DefineConstants mà đến từ Globals PropertyGroup trừ khi được cung cấp từ dòng lệnh bằng/p: DefineConstants = "MY_DEFINE"

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