首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与节俭链接

与节俭链接
EN

Stack Overflow用户
提问于 2018-08-25 18:29:00
回答 1查看 826关注 0票数 2

当我尝试将我的可执行文件链接到我的使用thrift的库时,我得到了undefined reference to 'typeinfo for apache::thrift::transport::TTransportException' (和其他符号)。我在Ubuntu18.04上使用了GCC 7.3.0,在CLion中用CMake构建,我花了一天的时间在谷歌上搜索这个问题,并访问了thisthatthis链接。

CMake命令如下所示

对于我的共享对象:

代码语言:javascript
复制
TARGET_LINK_LIBRARIES(server INTERFACE
                      etcdclient
                      TopologyProtocols
                      event
                      ${THRIFT_LIBRARIES}
                      ${Boost_LIBRARIES}
                      lzo2
                      sqlite3
                      zmq
                      ${SPDK_LIBS}
                      ${DPDK_LIBS}
                      grpc
                      grpc++
                      gtest
                      gmock
                      xml2
                      stdc++fs
                      bfd
                      -l:libisal.so.2
                      sgutils2
                      pthread
                      uuid
                      rt
                      )

可执行的CMake命令:

代码语言:javascript
复制
TARGET_LINK_LIBRARIES(kserver
                      server
                      ${THRIFT_LIBRARIES}
                      )

CMake生成的链接器命令:

代码语言:javascript
复制
cmake_link_script CMakeFiles/kserver.dir/link.txt --verbose=1
/usr/bin/c++  -O3 -DNDEBUG   CMakeFiles/kserver.dir/main.cpp.o  -o kserver  -L/server/ext/spdk/build/lib  -L/server/ext/spdk/dpdk/build/lib  -L/server/ext/isal/lib -Wl,-rpath,/server/ext/spdk/build/lib:/server/ext/spdk/dpdk/build/lib:/server/ext/isal/lib:/server/cmake-build-release/lib/proj:/usr/local/lib:/server/cmake-build-release/ext/etcd:/server/cmake-build-release/protocols ../../lib/proj/libproj.so /usr/local/lib/libthrift.so /usr/local/lib/libthriftnb.so ../../ext/etcd/libetcdclient.so ../../protocols/libTopologyProtocols.so /home/user/vcpkg/installed/x64-linux/lib/libprotobuf.a -levent /usr/local/lib/libthrift.so /usr/local/lib/libthriftnb.so /home/user/vcpkg/installed/x64-linux/lib/libboost_system.a -llzo2 /home/user/vcpkg/installed/x64-linux/lib/libsqlite3.a -lpthread -ldl -lzmq -lspdk -ldpdk -lgrpc -lgrpc++ -lgtest -lgmock -lxml2 -lstdc++fs -lbfd -l:libisal.so.2 -lsgutils2 -lpthread -luuid -lrt

该命令看起来非常好,它与编译器和常规项目设置中的thriftthriftnbevent链接,这里是源代码根目录中根CMakeList.txt的内容

代码语言:javascript
复制
LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
LIST(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/cmake")

SET(CMAKE_CXX_STANDARD 17)
#SET(ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/lib")
#SET(LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/lib")
#SET(RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/bin")

ADD_COMPILE_OPTIONS(
        -include server.h
        #        -Wall
        #        -pedantic
        -march=native
)
ADD_COMPILE_DEFINITIONS(
        BOOST_COROUTINES_NO_DEPRECATION_WARNING
        GTEST_LINKED_AS_SHARED_LIBRARY
)
INCLUDE_DIRECTORIES(
        ${CMAKE_SOURCE_DIR}/lib/include/server
        ${CMAKE_SOURCE_DIR}/lib/include
)

LINK_DIRECTORIES(
        ${CMAKE_SOURCE_DIR}/ext/spdk/build/lib
        ${CMAKE_SOURCE_DIR}/ext/spdk/dpdk/build/lib
        ${CMAKE_SOURCE_DIR}/ext/isal/lib
)

FIND_PACKAGE(Boost REQUIRED COMPONENTS
             system)
FIND_PACKAGE(Protobuf REQUIRED)
FIND_PACKAGE(GRPC REQUIRED)
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/cmake/FindGRPC.cmake)

FIND_PACKAGE(LZO REQUIRED)
FIND_PACKAGE(sqlite3 REQUIRED)
FIND_PACKAGE(ZeroMQ CONFIG REQUIRED)
FIND_PACKAGE(GTest REQUIRED)
FIND_PACKAGE(Thrift REQUIRED)

ADD_SUBDIRECTORY(lib/server)
ADD_SUBDIRECTORY(ext/etcd)
ADD_SUBDIRECTORY(protocols)
ADD_SUBDIRECTORY(proc/kserver)

示例编译命令

代码语言:javascript
复制
/usr/bin/c++  -DBOOST_COROUTINES_NO_DEPRECATION_WARNING -DGTEST_LINKED_AS_SHARED_LIBRARY -Dserver_EXPORTS -I/home/user/sourcelib/include/server -I/home/user/sourcelib/include -I/home/user/sourceext/spdk/include -I/home/user/sourcecmake-build-release/ext/etcd -I/home/user/sourcecmake-build-release/protocols -I/home/user/vcpkg/installed/x64-linux/include  -O3 -DNDEBUG -fPIC   -include server.h -march=native -std=gnu++1z -o CMakeFiles/server.dir/misc/ServerHost.cpp.o -c /home/user/sourcelib/server/misc/ServerHost.cpp

我哪里做错了?

EN

回答 1

Stack Overflow用户

发布于 2018-08-26 19:42:15

我花了两天的时间才发现我的机器上安装了一些深奥的版本,在手动删除它并使用vcpkg everything linked提供的版本后,包管理器并不知道它。

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

https://stackoverflow.com/questions/52016362

复制
相关文章

相似问题

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