c++ 无法在Cmake中链接libssh

pinkon5k  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(139)

我正在尝试编译需要连接到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
我哪里做错了?

mhd8tkvw

mhd8tkvw1#

如果您查看传递给编译器的内容,错误就会变得非常清楚:

... -Wl,-rpath,/home/<username>/Qt/6.4.1/gcc_64/lib:  -L  -lssh

如你所见-L是空的。
要解决这个问题,让我们从target_link_libraries的正确用法开始,这是正确的用法:

target_link_libraries(SSH-Manager PRIVATE -L${LIBSSH_LIBRARY} -lssh)

不要给这个函数传递-Lxxx-lxxx之类的东西,这个函数不作为一个传递编译器选项的函数。如果你选中the libssh site,你会看到被填充的变量,比如find_package(package)填充了某些变量,然后你可以在你的CMakeLists.txt中使用,在你的例子中,你主要感兴趣的是${LIBSSH_LIBRARIES}。还要注意,您不应该使用link_directories()

target_link_libraries(SSH-Manager PRIVATE -L${LIBSSH_LIBRARY} -lssh)
# it should look like this
target_link_libraries(SSH-Manager PRIVATE ssh) #OR ${LIBSSH_LIBRARIES}

还要记住,如果您使用的是Linux,则软件包的名称可能区分大小写
编辑:作者也有别名,所以target_link_libraries(project ssh)就足够了。检查提供的链接,看看它在你的项目中的正确用法。

相关问题