2011-12-12 35 views
12

Chúng tôi có một dự án P (C/C++ trên Linux) bao gồm các thư viện lib1, lib2, lib3.Nhiều thư viện CMakeLists.txt

  • lib1 được độc lập liên kết đến một libs system-wide
  • lib2 liên kết đến lib1
  • lib3 liên kết đến cả lib1lib2

Chúng tôi có một P thư mục và thư mục thêm cho mỗi người trong số libs của chúng tôi (như vậy, P/lib1/, P/lib2/ ...). Mỗi thư viện cũng có các bài kiểm tra riêng.

Câu hỏi:

  • Xin vui lòng, làm thế nào để tổ chức CMakeLists.txt cho kịch bản này?
  • Chúng tôi có nên tạo chỉ một thư mục chính build hoặc một cho mỗi thư mục lib không?
  • Chúng tôi có thể có tùy chọn trong số CMakeLists.txt để liên kết STATIC vs. SHARED không?

Trả lời

22

Trong trường hợp này, tôi khuyên bạn nên sử dụng một thư mục/xây dựng duy nhất. CMake có khả năng sẽ tạo ra các thư mục lib1, lib2 và lib3 riêng biệt trong đó.

Chuyển đổi giữa TĨNH vs chia sẻ có thể được thực hiện bằng cách sử dụng lá cờ BUILD_SHARED_LIBS (kiểm tra tài liệu add_library)

đối với các tổ chức CMakeLists.txt Với, sự lựa chọn là của bạn:

  1. Bạn có thể tạo một CMakeLists.txt duy nhất có nhiều mục nhập add_library. Điều này có lợi ích mà bạn sẽ nhận được một CMakeLists.txt duy nhất, mà một số người có thể thích khi các dự án rất đơn giản.

  2. Bạn có thể chia dự án của mình thành nhiều CMakeLists.txt được phân phối trên các thư mục lib1, lib2 và lib3 của bạn và sử dụng một cmakelists.txt gốc với add_subdirectory. Lợi ích của việc thiết lập này là việc tạo các tệp xây dựng với một cuộc gọi dễ dàng hơn (trong thư mục build/directory) của bạn, nhưng sau đó bạn có thể dễ dàng bước vào ví dụ: lib3/và gọi make/msbuild ở đó. CMake sẽ đảm bảo rằng sự phụ thuộc được xây dựng một cách chính xác

Ví dụ 1:

project(P) 
# Setup lib1 
set (LIB1_SOURCES ...) # Fill in your set of source-files here... 
add_library(lib1 ${LIB1_SOURCES}) 
# Do similar for lib2 and lib3 
target_link_libraries(lib2 lib1) # Indicate that lib1 is needed for lib2 
target_link_libraries(lib3 lib1 lib2) # Indicate that lib2 and lib1 are needed for lib3 

Ví dụ 2:

project(P) 
add_subdirectory(lib1) 
add_subdirectory(lib2) 
add_subdirectory(lib3) 

Trong mỗi thư mục con thì bạn viết CMakeLists.txt của bạn. Ví dụ. trong trường hợp lib3:

project(lib3) 
set(LIB3_SOURCES ...) # Setup the list of sources here. 
add_library(lib3 ${LIB3_SOURCES}) 
# You can refer to other libraries which should be available from the root cmakelists. 
target_link_libraries(lib3 lib1 lib2) 
+0

Tuyệt vời, cảm ơn bạn. – Cartesius00

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