libtins 库的 C++ 未定义引用

C++ undefined reference for libtins library

我安装了 C++ 的 <a href="http://libtins.github.io/download/" rel="nofollow">libtins</a> 包,方法是按照描述构建它并将 #include <tins/tins.h> 添加到示例文件的 header .我 运行 ldconfig 但构建总是抛出未定义引用错误:

CMakeFiles/lts.dir/main.cpp.o: In function `main':
/home/patrick/ClionProjects/lts/main.cpp:6: undefined reference to `Tins::EthernetII::EthernetII(Tins::HWAddress<6ul, unsigned char> const&, Tins::HWAddress<6ul, unsigned char> const&)'
/home/patrick/ClionProjects/lts/main.cpp:7: undefined reference to `Tins::IPv4Address::IPv4Address(char const*)'
/home/patrick/ClionProjects/lts/main.cpp:7: undefined reference to `Tins::IPv4Address::IPv4Address(char const*)'
/home/patrick/ClionProjects/lts/main.cpp:7: undefined reference to `Tins::IP::IP(Tins::IPv4Address, Tins::IPv4Address)'
/home/patrick/ClionProjects/lts/main.cpp:8: undefined reference to `Tins::TCP::TCP(unsigned short, unsigned short)'
/home/patrick/ClionProjects/lts/main.cpp:10: undefined reference to `Tins::PDU::inner_pdu(Tins::PDU*)'
/home/patrick/ClionProjects/lts/main.cpp:12: undefined reference to `Tins::PDU::inner_pdu(Tins::PDU*)'
CMakeFiles/lts.dir/main.cpp.o: In function `Tins::EthernetII::~EthernetII()':
/usr/local/include/tins/ethernetII.h:46: undefined reference to `vtable for Tins::EthernetII'
/usr/local/include/tins/ethernetII.h:46: undefined reference to `Tins::PDU::~PDU()'
collect2: error: ld returned 1 exit status
make[3]: *** [lts] Error 1

我正在使用 CLion 作为 IDE 和以下 cmake 文件:

cmake_minimum_required(VERSION 3.5)
project(lts)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -ltins")

set(SOURCE_FILES main.cpp)

add_executable(lts ${SOURCE_FILES})

知道可能是什么问题吗?

编译器应该-ltins。参考CMake手册添加库依赖

CMake 变量 CMAKE_CXX_FLAGS 用于 编译器 标志,不适用于库。

要添加库,您应该使用 target_link_libraries:

target_link_libraries(lts tins)

如果您希望 所有 目标到 link 到同一个库,您应该将它添加到列表 CMAKE_STANDARD_LIBRARIES.


关于调试这类事情的小提示:设置 CMAKE_VERBOSE_MAKEFILE 或使用 make VERBOSE=1 来禁止正常的 CMake 构建输出,而是显示正常的 make 输出,这将向您显示 make 运行的所有命令,以及用于每个程序的所有标志和选项。这样您将能够看到 -ltins 标志作为编译器标志传递,而不是作为 linker 标志或库传递。

您的问题中有几件事需要解决。首先,让 CMake 为您找到 libtins 库的位置,然后使用 target_link_libraries() 将其添加到您的 lts 可执行文件中。在您问题的 CMake 示例中,您在编译器标志变量 (CMAKE_CXX_FLAGS) 中指定了库选项。另一件事是让 CMake 处理为 C++11 设置适当的编译器标志,而不是手动将它们添加到 CMAKE_CXX_FLAGS(这只会处理编译器部分而不处理链接器)。以下应该以稳健的、平台独立的方式做你想做的事:

cmake_minimum_required(VERSION 3.5)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(lts)

find_library(TINS_LIBRARY tins)

set(SOURCE_FILES main.cpp)
add_executable(lts ${SOURCE_FILES})

target_link_libraries(lts "${TINS_LIBRARY}")

我建议您阅读 find_library() and target_link_libraries() to understand what those commands do. For the C++11 stuff, I recommend this blog article 的 CMake 文档,以获得比 CMake 文档给您的内容更连贯的解释(披露:我写了这篇文章)。

来自 libtins 的 Download 页面:

In order to link your application with libtins on GCC or clang, use the -ltins flag

只需在您的 CMake 文件中添加以下行:

target_link_libraries(PROJECT_NAME -ltins)