2011-10-26 23 views
25

Tôi muốn lưu trữ số phiên bản của thư viện của mình chỉ ở một nơi. Vì vậy, tôi đã xác định một biến như vậy trong CMake-file:Cách đọc biến CMake trong mã nguồn C++

SET(LIBINTERFACE_VERSION 1 CACHE INTEGER "Version of libInterface") 

Với định nghĩa này, tôi có thể tạo ra một tập tin version.rc theo định nghĩa của Microsoft, mà tôi biên soạn vào thư viện và sau đó xuất hiện một cách chính xác trong các thuộc tính cửa sổ của tập tin dll của tôi.

Bây giờ tôi cũng muốn sử dụng biến CMake này trong mã nguồn C++ của mình, nhưng tôi thực sự không nhận được giải pháp làm việc. Tôi đã thử những điều khác nhau như thế này:

#ifndef VERSION_LIBINTERFACE 
    # define VERSION_LIBINTERFACE @[email protected] 
    #endif 

hay này:

unsigned int getLibInterfaceVersion() 
    { 
     return @[email protected]; 
    } 

Nhưng trình biên dịch sẽ không chấp nhận bất cứ điều gì. Vì các nghiên cứu của tôi trong CMake-Documentation không nhận được bất kỳ kết quả nào, tôi hy vọng rằng ai đó có thể cho tôi những lời khuyên cần thiết.

Xin cảm ơn trước.

+0

Bạn cần chuyển giá trị biến này tới trình biên dịch dưới dạng hằng số biên dịch trước. Cú pháp chính xác phụ thuộc vào trình biên dịch được sử dụng. –

+0

Tôi đang sử dụng trình biên dịch Visual Studio 2010. Vì vậy, tôi có thể sử dụng nó như các hằng số được liệt kê trong http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx? Bạn có thể cho tôi một ví dụ? – Snowfox

Trả lời

43

Cách đơn giản nhất để làm điều này, là để vượt qua LIBINTERFACE_VERSION như một định nghĩa với add_definition:

add_definitions(-DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION}) 

Tuy nhiên, bạn cũng có thể tạo ra một "header-file mẫu" và sử dụng configure_file. Bằng cách này, CMake sẽ thay thế @ LIBINTERFACE_VERSION @ của bạn. Điều này cũng có thể mở rộng hơn một chút vì bạn có thể dễ dàng thêm các định nghĩa hoặc biến bổ sung tại đây ...

Ví dụ: tạo ra một tập tin "version_config.h.in", nhìn như thế này:

#ifndef VERSION_CONFIG_H 
#define VERSION_CONFIG_H 

// define your version_libinterface 
#define VERSION_LIBINTERFACE @[email protected] 

// alternatively you could add your global method getLibInterfaceVersion here 
unsigned int getLibInterfaceVersion() 
{ 
    return @[email protected]; 
} 

#endif // VERSION_CONFIG_H 

Sau đó, thêm một dòng configure_file để cmakelists.txt của bạn:

configure_file(version_config.h.in ${CMAKE_BINARY_DIR}/generated/version_config.h) 
include_directories(${CMAKE_BINARY_DIR}/generated/) # Make sure it can be included... 

Và dĩ nhiên, chắc chắn rằng các version_config đúng. h được bao gồm trong các tệp nguồn của bạn.

+1

Cảm ơn bạn rất nhiều. Đó là những gì tôi đã tìm kiếm. – Snowfox

+1

add_definitions có lẽ dễ dàng hơn – frankliuao

+0

@frankliuao. Đồng ý, đó là lý do tại sao nó là câu đầu tiên của câu trả lời của tôi. –

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