2009-07-22 47 views
44

Tôi đang xây dựng hệ thống xây dựng dựa trên cmake cho sản phẩm của mình. Vấn đề là dự án Visual Studio, được tạo ra bởi cmake, không hiển thị các tệp tiêu đề trong trình duyệt giải pháp.Tệp tiêu đề danh sách trong dự án Visual Studio C++ được tạo bởi cmake

Tôi cần thêm gì trong CMakeList.txt để liệt kê các tệp tiêu đề? Giải pháp ưa thích là nơi không cần liệt kê từng tệp tiêu đề cụ thể.

Giải pháp Đây là một giải pháp tôi đến với:

file(GLOB_RECURSE INCS "*.h") 
add_library(myLib ${SRCS} ${INCS}) 

Cảm ơn

+5

Như một phần thưởng bạn có thể làm source_group (header FILES $ {INCS}) Để hiển thị chúng trong một thư mục riêng biệt VS –

Trả lời

34

Chỉ cần thêm các tập tin tiêu đề cùng với các tập tin nguồn:

PROJECT (Test) 

ADD_EXECUTABLE(Test test.cpp test.h) 

Hoặc sử dụng các biến:

PROJECT (Test) 

SET(SOURCE 
    test.cpp 
) 

SET(HEADERS 
    test.h 
) 

ADD_EXECUTABLE(Test ${SOURCE} ${HEADERS}) 
+6

IMO điều tất cả các câu trả lời bỏ lỡ (với ngoại lệ của @Simeon) là bạn don Không muốn liệt kê tất cả các tệp tiêu đề một cách rõ ràng, vì: 1. Các tiêu đề được liệt kê dưới dạng phụ thuộc rõ ràng có thể dễ dàng bị mất đồng bộ với các phần bạn đang sử dụng trong nguồn và 2. sử dụng, do đó, nó không cần thiết để nhập chúng theo cách thủ công. Vì vậy, chúng tôi thực sự cần một câu trả lời mà đưa CMakes sở hữu kiến ​​thức về các phụ thuộc tiêu đề và đưa chúng vào một nhóm cho giải pháp. –

+0

@JeffTrull: Thực ra CMake không biết bạn sử dụng tiêu đề nào - nó hoạt động với nhiều ngôn ngữ và nhiều trình biên dịch, và không thể dựa vào các trình biên dịch báo cáo các tiêu đề. Vì vậy, chúng ta cần phải liệt kê chúng một cách rõ ràng. Nó cũng sạch hơn cho việc phân phối mã nguồn. –

+1

Tôi đánh giá cao tính năng phụ thuộc của máy quét có thể chỉ hoạt động đối với một số ngôn ngữ ... nhưng nó hoạt động cho C++, và sẽ rất tuyệt khi có kiến ​​thức này mà CMake đã sở hữu sẵn cho người dùng Visual Studio. Nếu không, ít nhất có một số loại móc để chúng tôi có thể viết nó trong mã CMake (thông qua source_group). Một danh sách rõ ràng của các phụ thuộc chắc chắn sẽ đi cũ theo thời gian, khi biên dịch sẽ tiếp tục làm việc ngay cả khi nó sai. Plus, nó dư thừa ... –

18

Bí quyết cơ bản cho việc này là thêm tệp tiêu đề vào một trong các mục tiêu (có thể thực thi hoặc thư viện). Điều này đặc biệt khó chịu vì cmake đã biết tất cả các phụ thuộc tập tin tiêu đề và nên xử lý điều này cho chúng ta. Bạn có thể tổ chức thêm bằng cách sử dụng lệnh source_group:

source_group("My Headers" FILES ${MY_HDRS}) 

Lưu ý rằng bạn cũng phải làm điều tương tự trong Xcode.

9

Tôi gặp vấn đề tương tự khi làm việc tại một hệ thống xây dựng cho dự án Qt và tôi đã đưa ra giải pháp này, nhờ các bài đăng khác trên trang này. Tôi đã bao gồm một ví dụ hoàn chỉnh được điều chỉnh từ các makefiles của tôi. Hi vọng điêu nay co ich!

cmake_minimum_required (VERSION 2.6) 
project (DemoSolution) 

find_package(Qt4 REQUIRED) 
include(${QT_USE_FILE}) 
add_definitions(${QT_DEFINITIONS}) 

include_directories (../../include/) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 

file(GLOB Demo_SOURCES *.cpp) 
file(GLOB Demo_HEADERS *.hpp) 
file(GLOB Demo_FORMS *.ui) 
file(GLOB Demo_RESOURCES resources.qrc) 

qt4_wrap_cpp(Demo_MOC ${Demo_HEADERS}) 
qt4_wrap_ui(Demo_FORMS_HEADERS ${Demo_FORMS}) 
qt4_add_resources(Demo_RESOURCES_RCC ${Demo_RESOURCES}) 

source_group("Headers" FILES ${Demo_HEADERS}) 
source_group("MOC" FILES ${Demo_MOC}) 

set(QT_USE_QTNETWORK, true) 
set(QT_USE_QTSQL, true) 
set(QT_USE_QTXML, true) 

add_library(Demo SHARED 
    ${Demo_SOURCES} 
    ${Demo_HEADERS} 
    ${Demo_MOC} 
    ${Demo_FORMS_HEADERS} 
    ${Demo_RESOURCES_RCC} 
    ) 

target_link_libraries(Demo ${QT_LIBRARIES}) 
add_definitions(-D_DEMO_EXPORTS) 
+4

Nó không phải là hình thức tốt để làm globbing. http://stackoverflow.com/questions/1027247/best-way-to-specify-sourcefiles-in-cmake. Từ tài liệu về cmake: Chúng tôi khuyên bạn không nên sử dụng GLOB để thu thập danh sách các tệp nguồn từ cây nguồn của bạn. Nếu không có CMakeLists.thay đổi tập tin txt khi một nguồn được thêm vào hoặc gỡ bỏ thì hệ thống xây dựng được tạo ra không thể biết khi nào nên yêu cầu CMake tái sinh. – Vitali

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