2009-11-25 41 views
6

Tôi đang cố gắng sử dụng CMake để biên dịch một ứng dụng C++ sử dụng thư viện C GStreamer.Vấn đề liên kết CMake

tập tin main.cpp của tôi trông như thế này:

extern "C" { 
#include <gst/gst.h> 
#include <glib.h> 
} 


int main(int argc, char* argv[]) 
{ 
    GMainLoop *loop; 

    GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink; 
    GstBus *bus; 

    /* Initialisation */ 
    gst_init (&argc, &argv); 
    return 0; 
} 

này hoạt động:

g++ -Wall $(pkg-config --cflags --libs gstreamer-0.10) main.cpp -o MPEG4GStreamer 

Làm thế nào để tôi làm cho nó với CMake? tập tin CMakeLists.txt của tôi trông như thế này:

cmake_minimum_required (VERSION 2.6) 
project (MPEG4GStreamer) 
add_executable (MPEG4GStreamer main.cpp) 
include(${CMAKE_ROOT}/Modules/FindPkgConfig.cmake) 

# Set CMAKE_C_FLAGS variable with info from pkg-util 
execute_process(COMMAND pkg-config --cflags gstreamer-0.10 
       OUTPUT_VARIABLE CMAKE_C_FLAGS) 
string(REPLACE "\n" "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) 
message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") 

# Set CMAKE_LINKER_FLAGS variable with info from pkg-util 
execute_process(COMMAND pkg-config --libs gstreamer-0.10 
       OUTPUT_VARIABLE CMAKE_LINKER_FLAGS) 
string(REPLACE "\n" "" CMAKE_LINKER_FLAGS ${CMAKE_LINKER_FLAGS}) 
message("CMAKE_LINKER_FLAGS: ${CMAKE_LINKER_FLAGS}") 

set_target_properties(MPEG4GStreamer 
         PROPERTIES COMPILE_FLAGS ${CMAKE_C_FLAGS} 
           LINKER_FLAGS ${CMAKE_LINKER_FLAGS}) 

Output đưa ra một lỗi mối liên kết:

~ $ cmake . 
CMAKE_C_FLAGS: -D_REENTRANT -I/usr/include/libxml2 -I/opt/local/include/gstreamer-0.10 -I/opt/local/include/glib-2.0 -I/opt/local/lib/glib-2.0/include -I/opt/local/include 
CMAKE_LINKER_FLAGS: -L/opt/local/lib -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lxml2 -lpthread -lz -lm -lglib-2.0 -lintl -liconv 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /Users/francis/ 
~ $ make 
Linking CXX executable MPEG4GStreamer 
Undefined symbols: 
    "_gst_init", referenced from: 
     _main in main.cpp.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make[2]: *** [MPEG4GStreamer] Error 1 
make[1]: *** [CMakeFiles/MPEG4GStreamer.dir/all] Error 2 
make: *** [all] Error 2 
~ $ 

Trả lời

5

Doh, chỉ cần thiết để thay thế CMAKE_LINKER_FLAGS với CMAKE_EXE_LINKER_FLAGS.

+0

bạn nên đóng câu hỏi này – lorenzog

2

Bạn nên tìm thư viện gstreamer-0.10 và sử dụng target_link_libraries để liên kết nó với mục tiêu của bạn. Bạn cần một mô-đun FindGStream.cmake, đây là một trong tôi tìm thấy với một tìm kiếm google:

http://gitorious.org/phonon/import/blobs/88743646f086352c5b41544ad6b0b48d2379df62/cmake/FindGStreamer.cmake

Với một mô-đun như vậy, bạn sẽ muốn một cái gì đó như thế này:

bao gồm (FindGStreamer.cmake) include_directories ($ {GSTREAMER_INCLUDE_DIR}) add_definitions ($ {GSTREAMER_DEFINITIONS}) target_link_libraries (MPEG4GStreamer $ {GSTREAMER_LIBRARIES})

4

vấn đề thực sự là bạn đã đánh sai p roperty tên, đó là LINK_FLAGS, không LINKER_FLAGS. Giải pháp của bạn chỉ là một giải pháp.

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