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)