首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Github存储库代码编译CMake脚本时的链接器错误

使用Github存储库代码编译CMake脚本时的链接器错误
EN

Stack Overflow用户
提问于 2022-07-07 21:22:42
回答 1查看 89关注 0票数 0

我克隆了这个Github项目:

https://github.com/machinezone/IXWebSocket

将示例代码粘贴到我自己的空项目main.cpp (粘贴在下面),并编写了一个基本的CMakeLists.txt (粘贴在下面)。

克隆的Github项目编译/链接良好,并输出一个库:IXWebSocket/build/libixwebsocket.a

示例代码(现在在我的项目中)编译,但我在链接方面遇到了问题。我用:

代码语言:javascript
复制
target_link_libraries(IXWebSocketTest <path/to/code>/IXWebSocket/build/libixwebsocket.a)

我目前正在收到这个错误,好像链接不正确一样:

代码语言:javascript
复制
/usr/bin/ld: /usr/bin/ld: DWARF error: invalid or unhandled FORM value: 0x23
IXWebSocket/build/libixwebsocket.a(IXWebSocketPerMessageDeflateCodec.cpp.o): in function `ix::WebSocketPerMessageDeflateCompressor::~WebSocketPerMessageDeflateCompressor()':
IXWebSocketPerMessageDeflateCodec.cpp:(.text+0x78): undefined reference to `deflateEnd'
/usr/bin/ld: 

我的CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.2)
project(IXWebSocketTest)
set(CMAKE_BUILD_TYPE Release)
add_executable(IXWebSocketTest main.cpp)
include_directories("<path/to/code>/IXWebSocket/")

# I think this line might be wrong?
target_link_libraries(IXWebSocketTest <path/to/code>/IXWebSocket/build/libixwebsocket.a)

更新

CMake文件已更改为:

代码语言:javascript
复制
add_executable(IXWebSocketTest main.cpp)
include_directories(<path>/IXWebSocket/")
find_package(ZLIB)
find_package(OpenSSL 1.1 REQUIRED)
include_directories(SYSTEM ${OPENSSL_INCLUDE_DIR})

target_link_libraries(IXWebSocketTest OpenSSL::SSL OpenSSL::Crypto libixwebsocket.a ZLIB::ZLIB) 

给出这个命令行:

/usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/IXWebSocketTest.dir/main.cpp.o -o IXWebSocketTest /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/x86_64-linux-gnu/libcryp.so -Wl,-Bstatic -lixwebsocket -Wl,-Bdynamic /usr/lib/x86_64-linux/libz.so

其结果是:

代码语言:javascript
复制
/usr/bin/ld: /usr/local/lib/libixwebsocket.a(IXSocketOpenSSL.cpp.o): in function `ix::SocketOpenSSL::openSSLInitialize()':
IXSocketOpenSSL.cpp:(.text+0x209): undefined reference to `OPENSSL_init_ssl'
/usr/bin/ld: IXSocketOpenSSL.cpp:(.text+0x221): undefined reference to `OPENSSL_init_ssl'
/usr/bin/ld: IXSocketOpenSSL.cpp:(.text+0x230): undefined reference to `OPENSSL_init_ssl'
/usr/bin/ld: /usr/local/lib/libixwebsocket.a(IXSocketOpenSSL.cpp.o): in function `ix::SocketOpenSSL::getSSLError[abi:cxx11](int)':
IXSocketOpenSSL.cpp:(.text+0x2fc): undefined reference to `SSL_get_error'
/usr/bin/ld: IXSocketOpenSSL.cpp:(.text+0x38e): undefined reference to `ERR_get_error'
/usr/bin/ld: IXSocketOpenSSL.cpp:(.text+0x3dc): undefined reference to `ERR_error_string'
/usr/bin/ld: IXSocketOpenSSL.cpp:(.text+0x49c): undefined reference to `ERR_get_error'
/usr/bin/ld: IXSocketOpenSSL.cpp:(.text+0x4e3): undefined reference to `ERR_error_string'
EN

回答 1

Stack Overflow用户

发布于 2022-07-07 21:49:29

短答案

libixwebsocket构建为共享库cmake -DBUILD_SHARED_LIBS=ON ...

更长的答案

当您构建静态库时,它的依赖项实际上并不是内置到库中的。编译器只是标记依赖关系将在稍后的链接阶段提供。因此,假设您将在链接阶段与库一起提供它们。可能的解决办法是

  • 将库作为共享的
  • IXWebSocket连接到您的项目作为依赖项,而构建libixwebsocket作为中间步骤,CMake负责处理依赖关系。

UPD

来自IXWebSocket的文档

代码语言:javascript
复制
$ clang++ --std=c++11 --stdlib=libc++ main.cpp -lixwebsocket -lz -framework Security -framework Foundation

因此,假设您应该链接到zlib。你的CMakeLists.txt应该看起来像

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.2)
project(IXWebSocketTest)
set(CMAKE_BUILD_TYPE Release)
add_executable(IXWebSocketTest main.cpp)
include_directories("<path/to/code>/IXWebSocket/")

find_package(ZLIB)

# I think this line might be wrong?
target_link_libraries(IXWebSocketTest <path/to/code>/IXWebSocket/build/libixwebsocket.a ZLIB::ZLIB) 

而且,您可能需要启用c++11

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72904377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档