代码之家  ›  专栏  ›  技术社区  ›  DrTarr

X11未与CMAKE正确链接->命令行中缺少DSO

  •  0
  • DrTarr  · 技术社区  · 8 年前

    这似乎是一个常见的问题,我认为我找到了答案,但由于某些原因,它不起作用。我有一个使用GTK2库的项目,在第一次编译和链接时,我收到错误“libgtk-x11-2.0.so.0:error adding symbols:DSO missing from command line”。一些人在搜索其他问题时,我发现了这个问题。X11没有间接链接,所以我还需要将其添加到CMakeLists文件中。现在cmake找到了我的X11包,但由于某种原因,我仍然收到错误消息,有什么想法吗?

    我的CMakeLists.txt:

    #####################################
    cmake_minimum_required (VERSION 3.0) 
    project (opencvtest)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    find_package(OpenCV REQUIRED)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(X11 REQUIRED gdk-x11-2.0)
    include_directories(${X11_INCLUDE_DIR})
    link_directories(${X11_LIBRARIES})
    pkg_check_modules(GTK2 REQUIRED gtk+-2.0)
    include_directories(${GTK2_INCLUDE_DIRS})
    link_directories(${GTK2_LIBRARY_DIRS})
    add_definitions(${GTK2_CFLAGS_OTHER})
    IF  ( OpenCV_FOUND AND AND GTK2_FOUND AND X11_FOUND)
        add_executable (main main.cpp)
    ELSE()
        MESSAGE(FATAL_ERROR "LIBRARIES MISSING!")
    ENDIF()
    #####################################
    

    还有一个附带问题。我看到了用于库和包含目录的各种变量。例如,上面的GTK2使用GTK2_LIBRARY_DIRS,而X11使用X11_LIBRARIES。此外,更微妙的是,X11_INCLUDE_DIR与GTK2_INCLUDE_DIRS。我尝试了X11的任何一种方法,但得到了相同的结果,但是我只找到了其他使用我上面的方法的人的例子,所以我坚持使用它。是否有应遵循的标准,或是否因包装而异?你从哪里知道哪些变量要与什么包一起使用?


    另外,还有一个注意事项:阅读其他问题时,我发现pkg-config可以用来查看其他库需要包含哪些内容,例如:

    pkg-config --print-requires --print-requires-private gtk+-2.0
    
    gdk-x11-2.0
    atk
    cairo
    gdk-pixbuf-2.0
    gio-2.0
    pangoft2
    

    但如果我按照CMakeLists中的显示使用它。txt,难道它不应该为我处理链接吗?否则,使用“find_package(X11 REQUIRED)”和“pkg_check_modules(X11 REQUIRED)”有什么区别?对不起,我正在学习其他示例,现在正在做更多的阅读,但我认为包配置应该为我处理这个问题吗?


    另一个编辑,在阅读其他一些帖子时,“target_link_librarys”似乎比“link_directories”更受欢迎,所以我将它们全部移动过来,并尝试使用“-lX11”,尽管它可能是多余的。

    #####################################
    cmake_minimum_required (VERSION 3.0) 
    project (opencvtest)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    find_package(OpenCV REQUIRED)
    find_package(PkgConfig REQUIRED)
    
    pkg_check_modules(X11 REQUIRED gdk-x11-2.0)
    include_directories(${X11_INCLUDE_DIR})
    
    pkg_check_modules(GTK2 REQUIRED gtk+-2.0)
    include_directories(${GTK2_INCLUDE_DIRS})
    add_definitions(${GTK2_CFLAGS_OTHER})
    
    add_executable (main main.cpp)
    target_link_libraries (main 
        ${X11_LIBRARIES}
        ${GTK2_LIBRARY_DIRS}
        -lX11
    )
    #####################################
    

    结果仍然相同:

    /usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: undefined reference to symbol 'gtk_init_check'
    //usr/lib/arm-linux-gnueabihf/libgtk-x11-2.0.so.0: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    CMakeFiles/main.dir/build.make:140: recipe for target 'main' failed
    make[2]: *** [main] Error 1
    CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed
    make[1]: *** [CMakeFiles/main.dir/all] Error 2
    Makefile:76: recipe for target 'all' failed
    make: *** [all] Error 2
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   DrTarr    8 年前

    Tsyvarev是正确的,制作时的错误信息非常误导。实际上,我对GTK2库的链接不正确,但在创建过程中产生的错误是关于X11库链接的。实际上,以下cmake文件工作正常:

    #####################################
    cmake_minimum_required (VERSION 3.0) 
    project (opencvtest)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    find_package(OpenCV REQUIRED)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(GTK2 REQUIRED gtk+-2.0)
    include_directories(${GTK2_INCLUDE_DIRS})
    add_definitions(${GTK2_CFLAGS_OTHER})
    add_executable (main main.cpp)
    target_link_libraries (main 
        ${GTK2_LIBRARIES}
    )
    #####################################
    

    这也回答了我的其他问题。是的,PkgConfig确实处理了GTK2的库依赖项,IF(我的错误),您正确链接了库!