如何强制 CMake 目标使用特定的 OpenSSL 版本

问题描述 投票:0回答:3

我在 Linux 中有一个 CMake 项目,我在其中构建了几个共享库,其中一些需要 OpenSSL 最新版本。我使用 Microsoft

vcpkg
作为我的工具链,并且必须使用
OpenSSL 3.2.0 23 Nov 2023
安装
./vcpkg install openssl:x64-linux

其中一个库

myrrlib
使用专有库,其中
libssl.a
libcrypto.a
由供应商在库源文件夹中提供。当我运行
OpenSSL 1.1.1m  14 Dec 2021
时,他们的版本似乎是
strings libcrypto.a | grep "OpenSSL"

在根文件夹中,我的

CMakeLists.txt
find_package(OpenSSL REQUIRED)
,这将导致
vcpkg
找到
libcrypto.a
的以下文件:

/root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a

我的问题是如何强制使用 OpenSSL 1.1.1

myrrlib

cmake_minimum_required(VERSION 3.26)

set(RR_LIB_DIR "external/pakages/rr/lib")   
set(RR_LIB_FILES
        vendorlib1
        vendorlib2
        vendorlib3
        ssl    # libssl.a is provided by the RR library (it is not installed by vcpkg)
        crypto # libcrypto.a is provided by the RR library (it is not installed by vcpkg)
)

add_library(myrrlib SHARED)
set_property(TARGET myrrlib PROPERTY CXX_STANDARD 17)
target_sources(myrrlib PRIVATE "src/myrrlib.cpp" "src/myrrlib.h")
target_include_directories(myrrlib PUBLIC ${RR_INCLUDE_DIR})
target_link_directories(myrrlib PUBLIC ${RR_LIB_DIR})
target_link_libraries(myrrlib PUBLIC ${RR_LIB_FILES})

当我构建分片库时

myrrlib
我收到以下链接错误:

/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: warning: alignment 8 of symbol `bio_lookup_lock' in /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-bio_addr.o) is smaller than 32 in /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(b_addr.o)
/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-bio_addr.o): in function `BIO_ADDR_new':
/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/bio/bio_addr.c:53: multiple definition of `BIO_ADDR_new'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(b_addr.o):b_addr.c:(.text+0x0): first defined here
/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-bio_addr.o): in function `BIO_ADDR_free':
/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/bio/bio_addr.c:64: multiple definition of `BIO_ADDR_free'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(b_addr.o):b_addr.c:(.text+0x50): first defined here
/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-bio_addr.o): in function `BIO_ADDR_clear':
/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/bio/bio_addr.c:96: multiple definition of `BIO_ADDR_clear'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(b_addr.o):b_addr.c:(.text+0x70): first defined here
/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-bio_addr.o): in function `BIO_ADDR_make':
/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/bio/bio_addr.c:106: multiple definition of `BIO_ADDR_make'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(b_addr.o):b_addr.c:(.text+0x110): first defined here

...
many more
...

/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/engine/eng_lib.c:280: multiple definition of `ENGINE_get_finish_function'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(eng_lib.o):eng_lib.c:(.text+0x530): first defined here
/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-eng_lib.o): in function `ENGINE_get_ctrl_function':
/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/engine/eng_lib.c:285: multiple definition of `ENGINE_get_ctrl_function'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(eng_lib.o):eng_lib.c:(.text+0x540): first defined here
/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-eng_lib.o): in function `ENGINE_get_flags':
/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/engine/eng_lib.c:290: multiple definition of `ENGINE_get_flags'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(eng_lib.o):eng_lib.c:(.text+0x550): first defined here
/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-eng_lib.o): in function `ENGINE_get_cmd_defns':
/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/engine/eng_lib.c:295: multiple definition of `ENGINE_get_cmd_defns'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(eng_lib.o):eng_lib.c:(.text+0x560): first defined here
/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/ld: /root/programs/vcpkg/installed/x64-linux/debug/lib/libcrypto.a(libcrypto-lib-eng_lib.o): in function `ENGINE_get_static_state':
/root/programs/vcpkg/buildtrees/openssl/x64-linux-dbg/../src/nssl-3.2.0-5a1db6e780.clean/crypto/engine/eng_lib.c:307: multiple definition of `ENGINE_get_static_state'; /mnt/c/Dev/myproject/external/packages/rr/lib/libcrypto.a(eng_lib.o):eng_lib.c:(.text+0x570): first defined here
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/myrrlib.dir/build.make:119: lib/libmyrrlib.so] Error 1
make[2]: *** [CMakeFiles/Makefile2:520: CMakeFiles/myrrlib.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:527: CMakeFiles/myrrlib.dir/rule] Error 2
make: *** [Makefile:283: myrrlib] Error 2

如果我将其构建为静态,

add_library(myrrlib STATIC)
,我可以毫无问题地成功构建库。当我将其构建为共享库时,我不知道问题出在哪里。

有人可以告诉我这个问题如何解决吗?

c++ cmake openssl shared-libraries vcpkg
3个回答
1
投票

我建议将 -DCMAKE_VERBOSE_MAKEFILE=ON 添加到 cmake 参数并提供相关的构建输出,以帮助诊断问题。


0
投票

不久前刚刚遇到类似的问题。我建议阅读这个问题,我发现这很有帮助。


0
投票

检查 ${RR_LIB_FILES} 的值。 错误表明此行

target_link_libraries(myrrlib PUBLIC ${RR_LIB_FILES})
链接到两个 libcrypto.a 库。这当然是非法的。 打印出来并检查是否有重复项。

我怀疑,随着 myrrlib 从 SHARED 切换到 STATIC,依赖项也会构建和/或导入(链接)为 STATIC,这(可能)导致将 libcrypto.a 保留在内部子库中。

© www.soinside.com 2019 - 2024. All rights reserved.