Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 未定义对OpenSSL\u版本的引用,链接OpenSSL时出错?_C_Cmake_Openssl_Linker Errors - Fatal编程技术网

C 未定义对OpenSSL\u版本的引用,链接OpenSSL时出错?

C 未定义对OpenSSL\u版本的引用,链接OpenSSL时出错?,c,cmake,openssl,linker-errors,C,Cmake,Openssl,Linker Errors,正在尝试运行这个简单的程序 #include <openssl/ssl.h> int main() { printf("version: %s\n", OpenSSL_version(0)); return 0; } 我正在运行ubuntu 20.04 cmakelist.txt cmake_minimum_required(VERSION 3.16) project(untitled2 C) set(CMAKE_C_STANDARD 99)

正在尝试运行这个简单的程序

#include <openssl/ssl.h>
int main() {
    printf("version: %s\n", OpenSSL_version(0));
    return 0;
}
我正在运行ubuntu 20.04

cmakelist.txt

cmake_minimum_required(VERSION 3.16)
project(untitled2 C)

set(CMAKE_C_STANDARD 99)
add_executable(main main.c)
我猜链接中没有错误,因为openssl已经在usr/include中,而usr/include又在预处理器搜索树中。我是新加入cmake的,所以我非常感谢您的任何解释

target_link_libraries(main /usr/include/openssl/ssl.h)
不正确,因为您传递的是标头,而不是库

见文件:


这回答了你的问题吗
ld返回了1个退出状态
,周围的行是链接错误。您需要针对您打算使用的库进行链接。@fdk1342因此,如果我只使用命令行,如何在cmake中执行此操作一切正常问题在于我实际上无法处理cmake?通常,您使用命令
target\u link\u libraries()
来告诉目标在链接过程中需要哪些库。我不知道您的特定环境的具体情况。@fdk123已经使用
target\u link\u库(main/usr/include/openssl/ssl.h)进行了尝试
同样的问题仍然有效,但为什么需要使用所有大写字母?我是说OpenSSL::SSH,而不是OpenSSL::SSH。由于头文件实际上是ssl.h而不是ssl.h,当我可以首先使用target\u link\u库()时,使用find\u包有什么好处?我不是
cmake
方面的专家,我更精通自动工具。正如您所指出的,它不是严格需要的,但它似乎是可取的(如果图书馆提供的话),原因有很多:;您可以检查pacakge的特定版本,将其设置为如上所述的强制版本(早期失败,而不是在链接阶段),并在配置模式下导入必要的cflags/cxflags依赖项等。也许更熟悉cmake的人可以更好地解释这一点。
target_link_libraries(main /usr/include/openssl/ssl.h)
target_link_libraries(<target> ... <item>... ...)
find_package(OpenSSL REQUIRED)
target_link_libraries(main PUBLIC OpenSSL::SSL OpenSSL::Crypto)