X11 不正确 link CMAKE -> 命令行中缺少 DSO
X11 doesn't properly link with CMAKE -> DSO missing from command line
这实际上似乎是一个常见问题,我以为我找到了答案,但由于某种原因它不起作用。我有一个使用 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)" 有什么区别?抱歉,我正在关注其他示例,现在正在阅读更多内容,但我认为 package config 应该为我处理这个问题?
另一个编辑,阅读一些其他帖子似乎 'target_link_libraries' 比 '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
Tsyvarev 是正确的,制作时的错误消息非常具有误导性。我实际上对 GTK2 库有错误的 linking,但在制作过程中产生的错误是关于 X11 库 linking。实际上,以下 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 的库依赖项,如果(我的错误),你 link 库正确!
这实际上似乎是一个常见问题,我以为我找到了答案,但由于某种原因它不起作用。我有一个使用 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)" 有什么区别?抱歉,我正在关注其他示例,现在正在阅读更多内容,但我认为 package config 应该为我处理这个问题?
另一个编辑,阅读一些其他帖子似乎 'target_link_libraries' 比 '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
Tsyvarev 是正确的,制作时的错误消息非常具有误导性。我实际上对 GTK2 库有错误的 linking,但在制作过程中产生的错误是关于 X11 库 linking。实际上,以下 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 的库依赖项,如果(我的错误),你 link 库正确!