我按照描述的方式构建了libtins包,并将#include <tins/tins.h>添加到示例文件的头中,从而安装了C++包。我运行了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})知道有什么问题吗?
发布于 2016-04-16 22:36:35
你的问题中有几件事要解决。首先,让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}")我建议您阅读CMake文档以便图书馆()和图书馆()了解这些命令的作用。对于C++11,我建议这篇博客文章提供比CMake文档更有凝聚力的解释(公开:我写了这篇文章)。
发布于 2016-04-16 22:31:10
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标志作为编译器标志传递,而不是作为链接器标志或库传递。
发布于 2016-04-16 22:24:28
编译器应该是-ltins。请参阅关于如何添加库依赖项的CMake手册。
https://stackoverflow.com/questions/36670466
复制相似问题