2011-07-12 49 views
15

Tôi muốn bao gồm tệp .cpp trong hai mục tiêu khác nhau (trở thành hai dự án VS sau khi chạy CMake). Tôi muốn đặt COMPILE_FLAGS khác cho các dự án này.Cờ biên dịch khác nhau cho cùng một tệp trong các mục tiêu khác nhau

Tuy nhiên, khi tôi làm

SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags1") 
ADD_EXECUTABLE(project1 myfile.cpp) 
SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags2") 
ADD_EXECUTABLE(project2 myfile.cpp) 

các "flags2" áp dụng cho cả hai dự án, vì vậy nó có vẻ như các thuộc tính được ghi đè trong dòng 3 và không được coi là phù hợp 2. Đây có phải là sự thật hay tôi thiếu một cái gì đó? Có cách nào để giải quyết này?

Cảm ơn bạn!

Trả lời

14

Áp dụng lệnh set_target_properties cho các dự án và không để các tập tin nguồn:

add_executable(project1 myfile.cpp) 
set_target_properties(project1 PROPERTIES COMPILE_FLAGS "flags1") 
add_executable(project2 myfile.cpp) 
set_target_properties(project2 PROPERTIES COMPILE_FLAGS "flags2") 

Cờ đặt trên mục tiêu sẽ áp dụng cho tất cả các nguồn trong phạm vi mục tiêu.

+2

cảm ơn, nhưng tôi đang đặt tùy chọn tiêu đề được biên dịch trước và chúng phải khác nhau đối với precompiled.cpp và các tệp .cpp khác. – Philipp

5

Nếu bạn tuân thủ một mục tiêu cho mỗi triết lý thư mục con, bạn có thể làm như sau bằng cách sử dụng add_definitions để thêm cờ biên dịch của bạn.


# in ./CMakeLists.txt 
add_subdirectory(project1) 
add_subdirectory(project2) 

# in ./project1/CMakeLists.txt: 
add_definitions("flags1") 
add_executable(project1 ../myfile.cpp) 

# in ./project2/CMakeLists.txt: 
add_definitions("flags2") 
add_executable(project2 ../myfile.cpp) 

add_definitions áp dụng cho tất cả các file được biên soạn trong thư mục con này và những người dưới nó. Bạn có thể áp dụng cờ cho các tệp cụ thể bằng cách sử dụng các mục sau:

set_source_files_properties(myfile.cpp PROPERTIES COMPILE_FLAGS "flags") 
-2

Tôi giải quyết vấn đề này như sau. Trong CMakeLists.txt:

set_target_properties (test1 PROPERTIES COMPILE_DEFINITIONS "TARGET_ID=1") 
set_target_properties (test2 PROPERTIES COMPILE_DEFINITIONS "TARGET_ID=9") 

set_source_files_properties (source1.cpp PROPERTIES COMPILE_DEFINITIONS "FILE_ID=7") 
set_source_files_properties (source2.cpp PROPERTIES COMPILE_DEFINITIONS "FILE_ID=4") 

Trong một số tập tin tiêu đề:

#if TARGET_ID==1 && FILE_ID==7 
    #define SPECIAL_VALUE 17 
    #elif TARGET_ID==1 && FILE_ID==4 
    #define SPECIAL_VALUE 14 
    #elif TARGET_ID==9 && FILE_ID==7 
    #define SPECIAL_VALUE 97 
    #elif TARGET_ID==9 && FILE_ID==4 
    #define SPECIAL_VALUE 94 
    #endif 

Hơn nữa, bao gồm nêu trên tiêu đề trong cả hai source1.cppsource2.cpp và biên dịch Tôi nghĩ rằng, CMake không có giải pháp nào được chấp nhận hơn

0

Tôi đã gặp sự cố tương tự (cách chỉ định phụ thuộc đầu trang được biên dịch sẵn cho mỗi mục tiêu trên cùng một tệp nguồn). May mắn thay, hiệu ứng của set_source_files_properties chỉ là thư mục hiện tại (CMAKE_CURRENT_SOURCE_DIR). Tôi đã có thể sử dụng để đưa ra như sau:

In source directory: 

    CMakeLists.txt: 
    add_subdirectory(lib_varient_1) 
    add_subdirectory(lib_varient_2) 

    LibSources.cmake: 
    set(SOURCES 
     "${CMAKE_CURRENT_LIST_DIR}/Source1.cpp" 
     "${CMAKE_CURRENT_LIST_DIR}/Source2.cpp" 
     ...) 

    set_source_files_properties(${SOURCES} PROPERTIES 
     COMPILE_FLAGS "/Yu\"stdafx.h\"" 
        "/Fp\"${CMAKE_CURRENT_BINARY_DIR}/stdafx.pch\"") 

    set_source_files_properties(${SOURCES} PROPERTIES 
     OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/stdafx.pch") 

    set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/stdafx.cpp 
     PROPERTIES COMPILE_FLAGS "/Yc\"stdafx.h\"" 
        "/Fp\"${CMAKE_CURRENT_BINARY_DIR}/stdafx.pch\"") 

    set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/stdafx.cpp 
     PROPERTIES OBJECT_OUTPUTS "${CMAKE_CURRENT_BINARY_DIR}/stdafx.pch") 

    add_library(lib_varient_${VARIENT} ${SOURCES} stdafx.cpp) 

In lib_varient_1 

    CMakeLists.txt: 
    set(VARIENT 1) 
    include(../LibSources) 

In lib_varient_2 

    CMakeLists.txt: 
    set(VARIENT 2) 
    include(../LibSources) 

này hoạt động vì set_source_files_properties chỉ có tác dụng trên các tập tin CMakeLists.txt hiện hành. Tệp được bao gồm sẽ có các giá trị khác nhau cho $ {VARIENT} và $ {CMAKE_CURRENT_BINARY_DIR} vì nó được bao gồm từ hai tệp CMakeLists.txt khác nhau. Bạn cũng có thể thiết lập các cờ biên dịch khác nhau, các định nghĩa tiền xử lý hoặc bao gồm các đường dẫn trong mỗi tệp CMakeLists.txt của varient trước khi bao gồm tệp LibSources.cmake.

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