2010-02-05 37 views
39

Vì vậy, tôi đã có một thư viện tôi đang biên dịch và tôi cần liên kết các thứ bên thứ ba khác nhau tùy thuộc vào việc đó là bản sửa lỗi hoặc bản phát hành (cụ thể là bản phát hành hoặc phiên bản gỡ lỗi của các thư viện đó). Có cách nào dễ dàng để làm điều này trong Cmake?Liên kết các thư viện khác nhau để xây dựng Gỡ lỗi và Phát hành trong Cmake trên cửa sổ?

Edit: Tôi nên lưu ý Tôi đang sử dụng visual studio

Trả lời

70

Theo CMake documentation:

target_link_libraries(<target> [lib1 [lib2 [...]]] [[debug|optimized|general] <lib>] ...) 

A "debug", "tối ưu hóa", hay "chung" từ khóa chỉ ra rằng thư viện ngay sau đó sẽ chỉ được sử dụng chỉ dành cho cấu hình tương ứng.

Vì vậy, bạn sẽ có thể làm điều này:

add_executable(MyEXE ${SOURCES}) 

target_link_libraries(MyEXE debug 3PDebugLib) 
target_link_libraries(MyEXE optimized 3PReleaseLib) 
+12

Tôi làm điều này tất cả các thời gian, thậm chí nhiều gọn trên một dòng: target_link_libraries (MyEXE debug 3PDebugLib tối ưu hóa 3PReleaseLib) –

+8

gì nếu tên thư viện là như nhau, nhưng bạn muốn visual studio để tìm kiếm nó ở một con đường khác ? tức là tôi muốn liên kết mylib.lib nhưng tôi có hai phiên bản được biên dịch. một dưới /path/Debug/mylib.lib và một dưới /path/Release/mylib.lib (như thường là trường hợp với một số thư viện). Sau đó bạn làm gì? – Jubei

+1

@Jubei Xác định 2 biến. Một cho mỗi thư viện. – Qsiris

4

Bằng cách nào đó câu trả lời từ @ Mike Willekes có CMake liên kết trong cùng mục tiêu cả phát hành và debug cho tôi :(

Tôi chỉ làm việc này bằng cách đặt cả hai cấu hình trong một dòng, như được đề xuất bởi @sakra in a related question - và làm như vậy cho mọi thư viện cần được liên kết:

target_link_libraries (app 
    debug ${Boost_FILESYSTEM_LIBRARY_DEBUG} 
    optimized ${Boost_FILESYSTEM_LIBRARY_RELEASE}) 

target_link_libraries (app 
    debug ${Boost_LOG_LIBRARY_DEBUG} 
    optimized ${Boost_LOG_LIBRARY_RELEASE}) 

target_link_libraries (app 
    debug ${Boost_PROGRAM_OPTIONS_LIBRARY_DEBUG} 
    optimized ${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE}) 

# ... 
+0

Ah, đây là những gì đã xảy ra với tôi! Chúng tôi chỉ muốn liên kết một thư viện cụ thể trong chế độ phát hành, do đó phương pháp của bạn không hoạt động. Cuối cùng tôi đã làm việc xung quanh nó bằng cách sử dụng một cái gì đó như sau: 'if (CMAKE_BUILD_TYPE STREQUAL "Release") \t target_link_libraries ($ {ARG_NAME} \t \t \t $ {LIB_TCMALLOC} \t \t) \t endif()' –

+0

Hạn chế, @SteveLorimer, là trong nhiều máy tạo cấu hình - chẳng hạn như cho Visual Studio - điều này sẽ không hoạt động vì nó được thực hiện trong thời gian tạo. – Tarc

+0

không chắc tôi có hiểu không? Chúng tôi không liên kết tcmalloc trong các bản dựng gỡ lỗi. Chúng tôi liên kết tcmalloc trong bản phát hành. Đó là, không có một phiên bản gỡ lỗi của tcmalloc, do đó, liệt kê nó theo tối ưu hóa chỉ kết quả trong nó nhận được liên kết vào gỡ lỗi xây dựng cũng là –

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