我正在尝试编译需要连接到ssh服务器的C++ Qt应用程序,但我无法做到这一点,因为每次我尝试编译它时,我都会得到以下错误代码:
[1/1] Linking CXX executable SSH-Manager
FAILED: SSH-Manager
: && /usr/bin/c++ -g CMakeFiles/SSH-Manager.dir/SSH-Manager_autogen/mocs_compilation.cpp.o CMakeFiles/SSH-Manager.dir/src/main.cpp.o CMakeFiles/SSH-Manager.dir/src/mainwindow.cpp.o CMakeFiles/SSH-Manager.dir/src/ssh_connection.cpp.o -o SSH-Manager -Wl,-rpath,/home/<username>/Qt/6.4.1/gcc_64/lib: -L -lssh /home/<username>/Qt/6.4.1/gcc_64/lib/libQt6Widgets.so.6.4.1 /home/<>username/Qt/6.4.1/gcc_64/lib/libQt6Gui.so.6.4.1 /home/<username>/Qt/6.4.1/gcc_64/lib/libQt6Core.so.6.4.1 /usr/lib/x86_64-linux-gnu/libGL.so && :
/usr/bin/ld: CMakeFiles/SSH-Manager.dir/src/ssh_connection.cpp.o: in function `SSH_connection::SSH_connection()':
/home/<username>/Programming/Projects/SSH-Manager/src/ssh_connection.cpp:11: undefined reference to `ssh_new'
.
.
.
/usr/bin/ld: /home/<username>/Programming/Projects/SSH-Manager/src/ssh_connection.cpp:17:
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
和CMakeLists.txt的相关部分:
find_package(LIBSSH)
if (LIBSSH_FOUND)
message(${LIBSSH_VERSION})
include_directories(${LIBSSH_INCLUDE_DIR})
link_directories(${LIBSSH_LIBRARY_DIR})
target_link_libraries(SSH-Manager PRIVATE -L${LIBSSH_LIBRARY} -lssh)
else ()
message(Unable to find libssh!)
endif ()
我已经尝试过:
1.清除并重新安装了openssh-server和libssh-dev
1.已找到并验证libssh. h文件
1.包含的LIBSSH_DIR
我哪里做错了?
1条答案
按热度按时间mhd8tkvw1#
如果您查看传递给编译器的内容,错误就会变得非常清楚:
如你所见-L是空的。
要解决这个问题,让我们从
target_link_libraries
的正确用法开始,这是不正确的用法:不要给这个函数传递
-Lxxx
-lxxx
之类的东西,这个函数不作为一个传递编译器选项的函数。如果你选中the libssh site,你会看到被填充的变量,比如find_package(package)
填充了某些变量,然后你可以在你的CMakeLists.txt
中使用,在你的例子中,你主要感兴趣的是${LIBSSH_LIBRARIES}
。还要注意,您不应该使用link_directories()
。还要记住,如果您使用的是
Linux
,则软件包的名称可能区分大小写编辑:作者也有别名,所以
target_link_libraries(project ssh)
就足够了。检查提供的链接,看看它在你的项目中的正确用法。