2013-06-07 18 views
6

Tôi đang cố gắng sử dụng mô-đun GenerateExportHeader từ cmake.cmake và GenerateExportHeader

phần của CmakeLists.txt tôi:

add_compiler_export_flags() 
add_library(gui SHARED ${gui_CPP} ${gui_HPP}) 
generate_export_header(gui) 

nó hoạt động tốt đẹp cho dự án gui chính nó, nhưng khi tôi cố gắng để bao gồm các file .h gui trong một dự án khác, một #include "gui_export.h" không thể tìm thấy. Điều này rõ ràng là gui_export.h được tạo trong thư mục xây dựng của gui vốn không nằm trong đường dẫn của các dự án khác.

Giải pháp đơn giản là thêm dir xây dựng của gui vào các dự án khác bao gồm: 1. Tôi không tìm thấy giải pháp kosher 2. Tôi thậm chí không tìm được cách xây dựng dir của một mục tiêu

làm thế nào tôi có thể giải quyết vấn đề này tốt?

+0

hm, bạn đang cố gắng không nhắm mục tiêu liên kết hai dự án/dll nhưng vẫn sử dụng khai báo tiêu đề của tệp gui của bạn trong các dự án khác nhau? – Najzero

+0

Tôi liên kết chúng. Nó thay đổi gì? –

Trả lời

5

Với hiện đại (tức là 2,8 0,11 trở lên) CMake, cơ chế ưu tiên là:

target_include_directories(gui PUBLIC ${CMAKE_BINARY_DIR}/exports) 

sau đó, khi bạn xuất() thư viện của bạn (mà bạn nên làm) hoặc sử dụng nó trong một bối cảnh mà các thuộc tính giao diện mục tiêu! được biết (ví dụ: trong cùng một dự án CMake tổng thể, mà dường như là những gì bạn đang làm), target_link_libraries (foo gui) cũng sẽ nhận thư mục bao gồm cần thiết.

Đặt nó vào một thư mục nổi tiếng có phần trực giao. Trong cả hai trường hợp, bạn nên sử dụng target_include_directories để cho người tiêu dùng biết nơi tìm tiêu đề thư viện của bạn.

-2

Sử dụng xuất() để cho phép CMake tìm cây xây dựng của bạn. Bạn có thể xem openobex về gitorious để xem file config.cmake trông như thế nào.

OTOH, bạn không nên sử dụng tiêu đề xuất được tạo trong tiêu đề công khai của bạn hoặc cài đặt nó.

+1

Lời khuyên của bạn về việc không xuất bản tiêu đề với xuất khẩu có vẻ thú vị nhưng tôi không hiểu ý tưởng đó. Hãy tưởng tượng tôi có một thư viện với một tệp cpp đơn với một lớp A. Khi tôi xây dựng dưới cửa sổ, tôi cần phải nói cho lớp này được xuất khẩu. Theo như tôi biết nó thường được thực hiện bằng cách chuẩn bị tập tin .h với định nghĩa của lớp A với __declspec (dllexport). Từ phía bên kia, khi tôi muốn sử dụng lớp này ở một nơi khác, tôi nên sử dụng __declspec (dllimport). Đây là những gì generate_export_header làm. Làm thế nào sau đó nó nên được thực hiện mà không xuất bản tập tin xuất khẩu này? –

+0

Điều đó không có ý nghĩa. Tiêu đề xuất được * có nghĩa là * được sử dụng bởi người tiêu dùng của thư viện cũng như chính thư viện đó. – Matthew

+2

Tiêu đề phải được xuất. Họ không còn cách nào khác. Trong mục tiêu cài đặt của bạn, bạn sao chép nó ra và nó được bao gồm trong với các tiêu đề khác của bạn. – Atifm

4

Tôi đã giải quyết vấn đề này bằng cách sử dụng EXPORT_FILE_NAME, vì vậy bây giờ tôi có:

generate_export_header(gui EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/exports/gui_export.h) 

và trong tất cả các dự án tôi thêm $ {CMAKE_BINARY_DIR}/xuất khẩu/to bao gồm