2012-04-09 36 views
7

Vì vậy, tôi đang biên soạn các ví dụ cho libgstreamermm-0.10 và tôi đã gặp sự cố với CMake.Đường dẫn liên kết thư viện CMake Pkg-Config

Với phiên bản libgstreamermm-0.10 được cài đặt theo mặc định trên hệ thống của tôi, ví dụ segfaults. OK, vì vậy tôi có các nguồn mới nhất và cài đặt chúng vào/usr/local và lấy ví dụ mới. Mọi thứ đều tốt.

g++ main.cc player_window.cc -o test `pkg-config --cflags --libs gtkmm-3.0` `pkg-config --cflags --libs gstreamermm-0.10` 

hoạt động tốt và như mong đợi. Tuyệt vời, bây giờ để thử và làm cho nó để chơi độc đáo với CMake. Tôi tạo một tập tin CMakeLists.txt nhanh chóng. Tôi sử dụng pkg-config, vì nó hoạt động tốt và tôi không thực sự muốn thêm một module tìm. Vì vậy, tệp của tôi trông giống như sau:

cmake_minimum_required(VERSION 2.6.2) 
project(media_player_gtkmm) 

INCLUDE(FindPkgConfig) 

set(SOURCES main.cc player_window.cc) 

add_executable(media_player_gtkmm ${SOURCES}) 

#dependencies 
pkg_check_modules(GSTMM REQUIRED gstreamermm-0.10) 
pkg_check_modules(GTKMM REQUIRED gtkmm-3.0) 
include_directories(${GTKMM_INCLUDE_DIRS} ${GSTMM_INCLUDE_DIRS}) 
link_directories(${GTKMM_LIBRARY_DIRS} ${GSTMM_LIBRARY_DIRS}) 
target_link_libraries(media_player_gtkmm ${GTKMM_LIBRARIES} ${GSTMM_LIBRARIES}) 

Mọi thứ biên dịch cho đến giai đoạn liên kết, nơi tôi gặp lỗi biểu tượng không xác định. Sau đó tôi thấy đầu ra của pkg-config --libs gstreamermm-0.10 bắt đầu bằng -L/usr/local/lib. Tôi nhìn vào đầu ra của make VERBOSE=1 và CMake KHÔNG thêm lệnh -L vào lệnh liên kết, mặc dù tôi có dòng link_directories. Vì vậy, mặc dù tôi đang sử dụng tiêu đề cho phiên bản mới của gstreamer trong/usr/local/include, thư viện từ/usr/lib đang được sử dụng thay vào đó, khi tôi muốn phiên bản trong/usr/local/lib được sử dụng . Pkg-Config dường như nhận được điều này, và điều chỉnh cho phù hợp, nhưng CMake, mặc dù tôi có nó bằng cách sử dụng pkg-config nội bộ, không nhận được trên các cờ liên kết.

Tôi có thể đặt cờ liên kết theo cách thủ công ngay bây giờ, nhưng điều đó có vẻ hơi khó khăn. Tôi chắc chắn có một cách tốt hơn để xác định điều này.

Trả lời

8

link_directories chỉ ảnh hưởng đến các mục tiêu đến AFTER it. Vì vậy, bạn cần để di chuyển add_executable của bạn sau cuộc gọi link_directories.

+0

Tôi có. Tôi đang sử dụng direct_directories() chỉ thị, vì vậy nó nên thêm -L? Tôi đoán tôi là sự hiểu lầm những gì link_directories() nào. Tôi có thể sử dụng biến LDFLAGS, nhưng tôi không chắc chắn làm thế nào để làm điều đó và không clobber cờ linker riêng của CMake. –

+0

Phải, câu trả lời mới đến ... – Anonymous

+0

Điều đó đã làm điều đó, cảm ơn! –

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