2011-10-19 32 views
9

Tôi đang cố gắng sử dụng cmake (trên Linux với GNU make và g ++) để xây dựng một dự án với hai thư mục con: MyLib và MyApp. MyLib chứa nguồn cho một thư viện tĩnh; MyApp cần liên kết với thư viện đó. Tôi đang cố gắng xây dựng trên Linux bằng các tệp makefiles được tạo bằng cách sử dụng CMakeLists.txt sau:CMAKE: Xây dựng thư viện và liên kết với nó

cmake_minimum_required (VERSION 2.6) 
project (MyProj) 
include_directories (MyLib) 
file(GLOB MyLibSrc MyLib/*.cpp) 
add_library(MyLibrary STATIC ${MyLibSrc}) 
file(GLOB MyAppSrc MyApp/*.cpp) 
add_executable(MyApplication ${MyAppSrc}) 
target_link_libraries(MyApplication MyLibrary) 

Tác vụ 'gần như' này hoạt động. Nó không thành công tại thời gian liên kết bởi vì trong khi nó tạo libMyLibrary.a - nó nằm trong thư mục gốc. Khi tôi thêm:

link_directories(${MyProj_BINARY_DIR}) 

không có sự khác biệt.

Tôi đã có một vài câu hỏi (liên kết):

  1. cách tốt nhất để ép buộc cmake vào việc xây dựng thư viện của tôi và thực thi thành một 'thư mục dàn' — nói MyStage — để giữ mục tiêu tách là gì từ nguồn?
  2. Làm cách nào để thuyết phục cmake liên kết ứng dụng với thư viện?
  3. Nếu tôi muốn xây dựng bản gỡ lỗi và phiên bản phát hành, cách tốt nhất để mở rộng tập lệnh cmake của tôi là làm gì — đảm bảo rằng ứng dụng gỡ lỗi liên kết với thư viện gỡ lỗi và ứng dụng phát hành đối với thư viện phát hành?

Tôi là người mới đến tương đối so với cmake. Tôi đã đọc những gì tôi có thể tìm thấy trên web, nhưng thấy mình đang đấu tranh để có được thư viện của tôi để liên kết với thực thi của tôi. Loại cấu hình này, theo ý tôi, khá phổ biến. Một ví dụ mà từ đó đến giường cũi sẽ rất hữu ích, nhưng tôi đã không tìm thấy một.

Trả lời

3
  1. Sử dụng "hết nguồn". Tạo một thư mục chỉ sử dụng cho xây dựng và trong khi ở đó, gọi

    cmake <path to the sources, it may be relative>
  2. Hoặc sử dụng

    link_directories(${MyProj_BINARY_DIR}/MyLib)

    hoặc làm CMakeLists.txt trong mỗi thư mục con - đó sẽ là tốt hơn cho dự án lớn hơn rất nhỏ.

  3. Điều này hơi phức tạp, hãy kiểm tra CMAKE_BUILD_TYPE trong tài liệu (bạn có thể đặt nó và/hoặc "nếu" bởi nó). Bạn cũng có thể thiết lập nó từ dòng lệnh:

    cmake -DCMAKE_BUILD_TYPE=Debug
+0

tôi có thể xem như thế nào (1) có thể làm việc - mặc dù tôi không nghĩ rằng nó là gọn gàng. Tôi không muốn CMakeLists.txt trong 'thư mục dàn dựng' cùng với thư viện của mình, nếu tôi có thể giúp nó. – aSteve

+0

Uhm, không, không, CMakeLists.txt ở trong cây nguồn. Đường dẫn được chuyển như một đối số cho cmake là thư mục chứa tệp CMakeLists.txt cấp cao nhất. Trong thiết lập này, dir "dàn dựng" là hoàn toàn trống rỗng trước khi gọi cmake. – kralyk

3

Tôi đã khám phá ra giải pháp 'tối ưu' (1) ... như vậy, nghĩ mình nên đăng nó ở đây:

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage) 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage) 

Điều mà tôi bối rối trước đây là các thư viện tĩnh không được coi là một THƯ VIỆN bởi Cmake - chúng được coi là ARCHIVE.

+0

Câu trả lời hữu ích duy nhất tôi đã tìm thấy! Có đặt tên rất khó hiểu! – rationalcoder

15

Vâng, tốt hơn là đọc example và thực hiện chính xác những gì được đề xuất.

cmake_minimum_required (VERSION 2.6) 
project (MyProj CXX) 
add_subdirectory(MyLib) 
add_subdirectory(MyApp) 

Sau đó, đối với mỗi thư mục con được chỉ định, CMakeLists.file txt được tạo ra

mylib \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_library(MyLib ${SRC_FILES}) 

MyApp \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_executable(MyApp ${SRC_FILES}) 
target_link_libraries(MyApp MyLib) 
Các vấn đề liên quan