2012-02-18 32 views
27

Given tôi đã xác định một thực thi với tập tin nguồn chính của nó trong một file CMakeList.txt:Bạn có thể thêm các tệp nguồn khác vào tệp thực thi sau khi được xác định không?

ADD_EXECUTABLE(MyExampleApp main.cpp) 

Tôi có thể thêm file nguồn hơn nữa để thực thi này sau khi dòng này nhưng trong cùng một hoặc một bao gồm CMakeList.txt tập tin?

+3

Thông thường bạn làm điều đó sử dụng các biến thay vì các tập tin trên ADD_EXECUTABLE của bạn() dòng. – drescherjm

+4

@drescherjm đưa ra câu trả lời đúng - chỉ cần thu thập các nguồn của bạn với 'list (APPEND SOURCES src.cpp src2.cpp)' hoặc 'set (SOURCES src.cpp)' và 'set (SOURCES $ {SOURCES} src2.cpp)'. – arrowd

+0

Cảm ơn. Tôi đã làm nó như thế nhưng có vẻ như bằng cách nào đó tàn bạo. Dù sao. Nó hoạt động. –

Trả lời

32

Sử dụng target_sources, có sẵn từ cmake 3,1

ví dụ. target_sources(MyExampleApp PUBLIC ${extra_file})

https://cmake.org/cmake/help/v3.1/command/target_sources.html

+1

Nếu mục tiêu là một thư viện (không thực thi được), mẹo này cũng hoạt động, nhưng bạn nên sử dụng 'PRIVATE' thay vì' PUBLIC', nếu không thì tệp nguồn cụ thể sẽ được liên kết hai lần. –

8

Tôi nghĩ rằng bạn có thể sử dụng:

add_executable(MyExampleApp main.cpp) 
add_library(library STATIC ${ADDITIONAL_SOURCES}) 
set_target_properties(library PROPERTIES 
    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 
target_link_libraries(MyExampleApp library) 
+1

giải pháp thú vị cho vấn đề này :) thông minh –

+0

Cần lưu ý rằng điều này không làm việc cho các tệp tài nguyên Windows (.rc) out-of-the-box mặc dù chúng thường có thể được cung cấp dưới dạng tệp nguồn cho 'add_library()' . CMake than phiền rằng biến "CMAKE_RC_CREATE_STATIC_LIBRARY" không được đặt. Giải pháp thay thế cũng bao gồm tệp nguồn .c trống. –

3

Cần lưu ý rằng để có thêm các phiên bản gần đây của CMake (> 3.1 Tôi nghĩ rằng) người ta có thể thêm các tập tin SOURCES tài sản vào các mục tiêu.

http://www.cmake.org/cmake/help/v3.3/prop_tgt/SOURCES.html

+3

Hoặc bạn chỉ có thể sử dụng ['target_sources()'] (http://www.cmake.org/cmake/help/v3.3/command/target_sources.html?highlight=target_sources) (xem câu trả lời của DarthB [ở đây] (http://stackoverflow.com/a/31541070/4763489)). – Florian

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