libtins库的C ++未定义引用

时间:2016-04-16 22:22:37

标签: c++ cmake static-libraries

我为C ++安装了libtins软件包,方法是按照描述构建它,并将#include <tins/tins.h>添加到示例文件的标头中。我运行了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})

任何想法可能是什么问题?

4 个答案:

答案 0 :(得分:2)

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

要添加库,您应该使用target_link_libraries

target_link_libraries(lts tins)

如果您希望所有目标链接到同一个库,则应将其添加到列表CMAKE_STANDARD_LIBRARIES

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

答案 1 :(得分:2)

您的问题中有几件事需要解决。首先,让CMake为您找到libtins库的位置,然后使用GET /customerfind/:name controllers.Customers.findByName(name: String) 将其添加到target_link_libraries()可执行文件中。在您的问题的CMake示例中,您在编译器标志变量(CMAKE_CXX_FLAGS)中指定库选项。另一件事是让CMake处理为C ++ 11设置适当的编译器标志,而不是手动将它们添加到CMAKE_CXX_FLAGS(它只会处理编译器部分而不是链接器)。以下内容应以强大的,独立于平台的方式执行您想要的操作:

lts

我建议您阅读find_library()target_link_libraries()的CMake文档,以了解这些命令的作用。对于C ++ 11的东西,我建议this blog article给出一个比CMake文档给你的更具凝聚力的解释(披露:我写了这篇文章)。

答案 2 :(得分:0)

编译器应-ltins。有关如何添加库依赖项的信息,请参阅CMake手册。

答案 3 :(得分:0)

来自 libtins 的 Download 页:

<块引用>

为了将您的应用程序与 GCC 或 clang 上的 libtins 链接,请使用 -ltins 标志

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

target_link_libraries(PROJECT_NAME -ltins)