WSL中QT的动态链接不工作,但在docker容器中工作 我想建立一个动态连接Qt核心库的C++程序。

WSL中QT的动态链接不工作,但在docker容器中工作 我想建立一个动态连接Qt核心库的C++程序。,c++,qt,cmake,windows-subsystem-for-linux,ldd,C++,Qt,Cmake,Windows Subsystem For Linux,Ldd,为此,我使用WSL作为构建环境,使用CLion作为IDE。 当我在WSL(ubuntu_18.04)中编译这个程序时,链接器找不到库,但当我在docker容器(ubuntu_18.04)中编译它时,链接器找到库 我对此感到非常困惑,因为在我看来,我已经正确设置了库搜索路径。 有人知道这是什么原因吗 我的项目结构如下: apps - CMakeLists.txt - main.cpp extern - qt-linux src - CMakeLists.txt - functions.cpp -

为此,我使用WSL作为构建环境,使用CLion作为IDE。 当我在WSL(ubuntu_18.04)中编译这个程序时,链接器找不到库,但当我在docker容器(ubuntu_18.04)中编译它时,链接器找到库

我对此感到非常困惑,因为在我看来,我已经正确设置了库搜索路径。 有人知道这是什么原因吗

我的项目结构如下:

apps
- CMakeLists.txt
- main.cpp
extern
- qt-linux
src
- CMakeLists.txt
- functions.cpp
- functions.hpp
toolschains
- linux-toolchain.cmake
CMakeLists.txt
build.sh
CMakeLists.txt文件如下所示:

CMakeLists.txt: cmake_最低要求(3.10版) 项目(cpp_hello_world)

src/CMakeLists.txt:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

add_library(HelloLibrary SHARED functions.hpp functions.cpp)
target_link_libraries(HelloLibrary Qt5::Core)
target_include_directories(HelloLibrary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})


install(TARGETS HelloLibrary DESTINATION lib)
install(FILES functions.hpp DESTINATION include)
add_executable(hello-world main.cpp)

target_link_libraries(hello-world HelloLibrary)
target_link_libraries(hello-world -static-libgcc -static-libstdc++)
install(TARGETS hello-world DESTINATION bin)
apps/CMakeLists.txt:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

add_library(HelloLibrary SHARED functions.hpp functions.cpp)
target_link_libraries(HelloLibrary Qt5::Core)
target_include_directories(HelloLibrary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})


install(TARGETS HelloLibrary DESTINATION lib)
install(FILES functions.hpp DESTINATION include)
add_executable(hello-world main.cpp)

target_link_libraries(hello-world HelloLibrary)
target_link_libraries(hello-world -static-libgcc -static-libstdc++)
install(TARGETS hello-world DESTINATION bin)
我使用以下build.sh脚本进行构建:

#!/bin/bash

export SOURCE_DIR=$(pwd)
rm -R build
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../toolchains/linux- 
    toolchain.cmake -G "CodeBlocks - Unix Makefiles" ${SOURCE_DIR}

make
make install
ldd输出WSL:

    linux-vdso.so.1 (0x00007ffff62d6000)
    libHelloLibrary.so => /mnt/c/Users/ci/Documents/Development/cpp-cmake-prototype/Install/bin/../lib/libHelloLibrary.so (0x00007f7c96fb0000)
    libQt5Core.so.5 => not found
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7c96bb0000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7c97600000)
    libQt5Core.so.5 => not found
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7c96820000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7c965f0000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7c96250000)
ldd输出Docker容器:

    linux-vdso.so.1 (0x00007ffc6932a000)
    libHelloLibrary.so => /Install/bin/./../lib/libHelloLibrary.so (0x00007f36411db000)
    libQt5Core.so.5 => /Install/bin/./../lib/libQt5Core.so.5 (0x00007f3640c33000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3640842000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3641715000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f36404b9000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f36402a1000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3640082000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f363fe65000)
    libicui18n.so.60 => /usr/lib/x86_64-linux-gnu/libicui18n.so.60 (0x00007f363f9c4000)
    libicuuc.so.60 => /usr/lib/x86_64-linux-gnu/libicuuc.so.60 (0x00007f363f60d000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f363f409000)
    libdouble-conversion.so.1 => /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1 (0x00007f363f1f8000)
    libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f363eee2000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f363eb44000)
    libicudata.so.60 => /usr/lib/x86_64-linux-gnu/libicudata.so.60 (0x00007f363cf9b000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f363cd29000)
我现在明白了 问题在于libQt5Core.so.5是在.note.ABI-tag设置为与WSL标识为(4.4)但docker容器兼容(4.9)的版本的情况下构建的

与此类似:

在WSL上安装项目后,您是否实际拥有文件
/mnt/c/Users/ci/Documents/Development/cpp cmake prototype/Install/lib/libQt5Core.so.5
?如果找到了
libHelloLibrary.so
,那么也应该找到
libQt5Core.so.5
,因为它位于同一目录下。