2015-04-09 17 views
10

Tôi đang xây dựng thư viện tĩnh của mình bằng cách sử dụng object libraries như được hiển thị bằng CMake 3.1.3.cmake - giải nén tập tin pdb từ thư viện đối tượng

Tôi có

ADD_SUBDIRECTORY(A) 
ADD_SUBDIRECTORY(B) 
.... 
ADD_LIBRARY(mylib STATIC ${SOURCES} 
        $<TARGET_OBJECTS:A> 
        $<TARGET_OBJECTS:B>) 
SET_TARGET_PROPERTIES(mylib PROPERTIES COMPILE_PDB_NAME mylib COMPILE_PDB_OUTPUT_DIR ${CMAKE_BINARY_DIR}) 

Bây giờ, vấn đề của tôi là A tạo vc120.pdb trong thư mục con CMake Một nhân. B tạo ra vc120.pdb của riêng nó trong thư mục con CMake của B. Và, mylib tạo mylib.pdb trong thư mục cmake nhị phân chính.

Tôi chỉ muốn một thư viện tĩnh và một tệp pdb. Tôi chỉ muốn mylib và mylib.pdb.

Làm cách nào để hợp nhất tất cả vc120.pdbs vào mylib.pdb hoặc lý tưởng chỉ tạo một tệp pdb?

Trả lời

1

tôi đã cố gắng liên hệ với folks tại Kitware (chủ sở hữu CMake).

Họ đã nói,

"Đặt COMPILE_PDB_ * thuộc tính của A, B, và mylib tất cả để trỏ đến cùng một chỗ. Object thư viện được xây dựng một cách độc lập và không biết điều gì sẽ tiêu thụ chúng (hoặc nếu nhiều mục tiêu tiêu thụ chúng), vì vậy chúng cần được cấu hình riêng lẻ. "

Vì vậy, bên trong Một & B, làm

add_library(A OBJECT a.c) 
set_target_properties(A PROPERTIES 
    COMPILE_PDB_NAME "mylib" 
    COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" 
) 
+0

Sử dụng phương pháp có ý nghĩa đối với song song xây dựng. Xem http://zeuxcg.org/2010/11/22/z7-everything-old-is-new-again/ – sakra

3

Đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn, mà là giải pháp thay thế mà bạn có thể muốn xem xét.

Với thư viện tĩnh, có thể bạn nên sử dụng /Z7 để tạo thông tin gỡ lỗi. Khi sử dụng /Z7 trình biên dịch không tạo ra tệp .PDB, nhưng nhúng thông tin gỡ lỗi trực tiếp vào các tệp đối tượng đã tạo.

Khi các tệp đối tượng này sau đó được liên kết dưới dạng thư viện tĩnh, lib.exe sẽ sao chép thông tin gỡ lỗi từ tất cả các tệp đối tượng vào tệp .lib kết quả. Không cần phân phối tệp .pdb với tệp .lib.

Không giống như link.exe, được CMake sử dụng để tạo DLL hoặc EXE, lib.exe không có tùy chọn xuất tệp .PDB.

Thông qua CMake bạn có thể đặt các tùy chọn bắt buộc theo cách sau. Đối với việc sử dụng thư viện đối tượng:

add_library(A OBJECT lib2.cpp) 
set_target_properties(A PROPERTIES COMPILE_OPTIONS "/Z7") 

Để tạo thư viện tĩnh thức, sử dụng:

add_library(mylib STATIC main.cpp $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>) 
set_target_properties(mylib PROPERTIES COMPILE_OPTIONS "/Z7") 
Các vấn đề liên quan