LINUX.ORG.RU

Не линкуется CppServer с библиотекой

 , ,


0

1

Всем доброго времени суток

Есть консольное приложение, которое использует самописную библиотеку libSRouter.so, которая в свою очередь использует библиотеку libcppserver.so из GitHub, а конкретно CppServer::Asio::TCPClient. Библиотека libSRouter.so собирается нормально (подключение CppServer в CMake),

include_directories( ../../../../Lib/CppServer/include )
.
.
.
target_link_libraries(${PROJECT_NAME} PUBLIC 
                                                    ${CMAKE_SOURCE_DIR}/../../../../Lib/CppServer/bin/libcppserver.so
)
но в ней нет ссылки на конструктор CppServer::Asio::TCPClient, точнее не определён для неё адрес (смотрел через nm -C libSRouter.so),
$ nm -C libSRouter.so | grep TCPClient::TCPClient
                 U CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)

поэтому когда я пытаюсь слинковать libSRouter.so к приложению, то получаю ошибку
[build] /usr/bin/ld: ../../../srouter/build/Release/libSRouter.so: undefined reference to `CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'

Всё собирается с помощью CMake и Clang-15.0.1 под убунтой 22.04. Подскажите что я делаю не так

Ответ на: комментарий от UVV

Переделал немного сборку библиотеки libSRouter.so, так чтобы CppServer подключался через

find_package(CppServer)
.
.
.
target_link_libraries(${PROJECT_NAME} PUBLIC CppServer::CppServer)
но это ничего не дало - вот это так и осталось
$ nm -C libSRouter.so | grep TCPClient::TCPClient
                 U CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)

seijuurou
() автор топика
Ответ на: комментарий от UVV

может я конечно чего не так написал в файле FindCppServer.cmake

# CppServer_DIR - variable, which should be setted outside

set(SUFFIX_TO_PATH "")
if(WIN32)
  string(APPEND SUFFIX_TO_PATH "lib")
elseif(UNIX)
  string(APPEND SUFFIX_TO_PATH "bin")
endif()

file(GLOB_RECURSE H_FILES "${CppServer_DIR}/include/*"
	LIST_DIRECTORIES false)
find_path (CppServer_INCLUDE_DIR
  NAMES "server/asio/tcp_client.h"
  PATHS "${CppServer_DIR}/include"
  PATH_SUFFIXES ""
  DOC ""
)

find_library (CppServer_LIBRARY
  NAMES "CppServer.dll" "CppServer.lib" "libcppserver.so" "libcppserverd.so"
  PATHS ${CppServer_DIR}
  PATH_SUFFIXES ${SUFFIX_TO_PATH}
  DOC ""
)

include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (CppServer
  REQUIRED_VARS CppServer_INCLUDE_DIR CppServer_LIBRARY
)
mark_as_advanced (CppServer_INCLUDE_DIR CppServer_LIBRARY)

if (CppServer_FOUND)
  set (CppServer_INCLUDE_DIRS ${CppServer_INCLUDE_DIR})
  set (CppServer_LIBRARIES ${CppServer_LIBRARY})

  if (NOT TARGET CppServer::CppServer)
    add_library (CppServer::CppServer UNKNOWN IMPORTED)
    set_target_properties (CppServer::CppServer PROPERTIES
      IMPORTED_LOCATION_DEBUG "${CppServer_LIBRARY}"
      IMPORTED_LOCATION_RELEASE "${CppServer_LIBRARY}"
      IMPORTED_LOCATION_MINSIZEREL "${CppServer_LIBRARY}"
      IMPORTED_LOCATION_RELWITHDEBINFO "${CppServer_LIBRARY}"
      INTERFACE_INCLUDE_DIRECTORIES "${CppServer_INCLUDE_DIR}"
    )
  endif()
endif ()

seijuurou
() автор топика
Ответ на: комментарий от UVV

В систему ставится - я скачал её через conan и достал её наружу (проект кроссплатформенный и под винду и clang пока conan не пользуем), сначала просто подключал инклудами и so-файлом, потом написал cmake-файл для подключения через find_package, но в обоих случаях конструктор TCPClient-а не линкуется с адресом. Это при том что в самой libcppserver.so этот конструктор виден из вне

$nm -C libcppserver.so | grep TCPClient::TCPClient
00000000001a6600 T CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, asio::ip::basic_endpoint<asio::ip::tcp> const&)
00000000001a5a20 T CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::string const&, int)
00000000001a6000 T CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::string const&, std::string const&)
00000000001a6600 T CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, asio::ip::basic_endpoint<asio::ip::tcp> const&)
00000000001a5a20 T CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::string const&, int)
00000000001a6000 T CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::string const&, std::string const&)

seijuurou
() автор топика
Ответ на: комментарий от seijuurou

потом написал cmake-файл для подключения через find_package

Теперь понятно, зачем ты это сделал. Потому что авторы этого cppserver не экспортируют target’ы из своих CMakeLists по нормальному :/

Ты уверен, что библиотека найдена после find_package? Добавь пару сообщений для отладки.

UVV ★★★★★
()
Ответ на: комментарий от UVV

Да, библиотека найдена, вопрос решил путём задействования другого конструктора TCPClient-a

seijuurou
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.