Đầu tiên, cuộc gọi:
include(FindPkgConfig)
nên được thay thế bằng:
find_package(PkgConfig)
Cuộc find_package()
gọi linh hoạt hơn và cho phép các tùy chọn như REQUIRED
tự động thực hiện những việc mà người ta sẽ phải thực hiện theo cách thủ công include()
.
Thứ hai, pkg-config
nên tránh gọi thủ công khi có thể. CMake đi kèm với một bộ định nghĩa gói phong phú, được tìm thấy trong Linux /usr/share/cmake-3.0/Modules/Find*cmake
. Các tùy chọn này cung cấp nhiều tùy chọn và sự lựa chọn cho người dùng hơn là một cuộc gọi thô tới pkg_search_module()
.
Đối với target_use()
lệnh giả định đã đề cập , CMake đã tích hợp sẵn lệnh đó với PUBLIC | PRIVATE | INTERFACE. Một lệnh gọi like target_include_directories(mytarget PUBLIC ...)
sẽ làm cho các thư mục bao gồm được tự động sử dụng trong mọi mục tiêu sử dụng mytarget
, ví dụ target_link_libraries(myapp mytarget)
. Tuy nhiên, cơ chế này dường như chỉ dành cho các thư viện được tạo trong CMakeLists.txt
tệp và không hoạt động đối với các thư viện được mua bằng pkg_search_module()
. Cuộc gọi add_library(bar SHARED IMPORTED)
có thể được sử dụng cho điều đó, nhưng tôi chưa xem xét điều đó.
Đối với câu hỏi chính, điều này ở đây hoạt động trong hầu hết các trường hợp:
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
...
target_link_libraries(testapp ${SDL2_LIBRARIES})
target_include_directories(testapp PUBLIC ${SDL2_INCLUDE_DIRS})
target_compile_options(testapp PUBLIC ${SDL2_CFLAGS_OTHER})
Hàm SDL2_CFLAGS_OTHER
chứa các định nghĩa và các cờ khác cần thiết để biên dịch thành công. Các lá cờ SDL2_LIBRARY_DIRS
và SDL2_LDFLAGS_OTHER
tuy nhiên vẫn bị bỏ qua, không biết mức độ thường xuyên đó sẽ trở thành một vấn đề.
Tài liệu khác tại đây http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html
IMPORTED_TARGET
yêu cầu CMake 3.6 hoặc mới hơn.