【问题标题】:cmake can't find_package in docker imagecmake在docker镜像中找不到_package
【发布时间】:2021-05-04 11:56:55
【问题描述】:

我在docker中遇到了cmake的问题,cmake在系统中找不到OpenSSL包,但我确定它已经安装了。而且我看到有关未设置所需的内部 CMake 变量的奇怪错误。

我可以在普通 VM 中毫无问题地编译相同的代码,但我无法让它在 docker 中工作。

有人知道这里出了什么问题吗? 我已将完整代码上传到: https://gitlab.com/kenjichanhkg/docker_cmake_hello_world.git 请查看“cmake_helloworld”分支。

dockerfile 如下所示:

FROM gcc:latest
COPY . /usr/test/src
WORKDIR /usr/test/src

RUN apt update -y && apt install -y \
    cmake \
    libssl-dev \
    git

RUN ./build.sh

CMD [ "./build/test" ]

cmake 文件如下所示:

cmake_minimum_required( VERSION 3.13 )

find_package(OpenSSL REQUIRED)
project( docker_cmake_hello_world )

add_executable(test main.cpp)

include_directories(  
        ${OPENSSL_INCLUDE_DIR}
)

target_link_libraries(
        test
        OpenSSL::SSL
)

谢谢!!

【问题讨论】:

    标签: docker gcc cmake openssl


    【解决方案1】:

    我想你的 CMakeLists.txt 是错误的。 CMake 在project 命令中设置其环境,因此要正确使用find_package,您至少需要将该命令移到project 之后。并且include_directories命令需要在add_executable命令之前移动才能生效(也许你打算使用target_include_directories?)。由于 OpenSSL 已经提供了正确的导入目标 OpenSSL::SSL 您根本不需要为包含目录添加单独的命令。

    适合您的测试程序的 CMakeLists.txt 文件应如下所示:

    cmake_minimum_required(VERSION 3.13)
    
    project(docker_cmake_hello_world)
    
    find_package(OpenSSL REQUIRED)
    add_executable(test main.cpp)
    
    target_link_libraries(test PRIVATE OpenSSL::SSL)
    

    【讨论】:

    • 这是一个虚拟项目,但真正的问题是在我现有的项目中,并且 cmake 文件已经工作多年了
    • 由于您的 Github 存储库没有显示对 OpenSSL 的依赖,我坚持使用您的 CMake 文件。不过,您需要在 project 命令之后移动您的 find_package(OpenSSL REQUIRED)command。有关类似问题,请参见此处stackoverflow.com/questions/42017111/…
    • 重新排列项目命令使其工作,但这只是一个虚拟项目。在我的真实项目中,cmake仍然找不到OpenSSL cmake模块,我在dummy项目中无法重现同样的问题
    • 我发现问题出在我的 cmake 命令中,我做了类似 cmake -DOPENSSL_SSL_LIBRARY=/usr/local/lib64/libssl.so 之类的操作,结果搞砸了
    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2020-06-18
    • 2019-01-12
    相关资源
    最近更新 更多