gcc не связывается должным образом с gsoap

Я перевожу свою систему сборки приложений C ++ на cmake. Одной из зависимостей является gsoap ++, который генерирует SOAP-сервис и клиента. Чтобы ссылаться на это, я уточняю

set(CMAKE_CXX_LINK_FLAGS "-lgsoap++ ... [other flags]")

в корне CMakeLists.txt, Сгенерированные источники создаются с

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/generated/c++/ws)
set(GEN_WS_SOURCES ws/Bar.h ws/Bar_USCOREBinding.nsmap ws/soapBar_USCOREBindingProxy.h ws/soapBar_USCOREBindingProxy.cpp ws/soapBar_USCOREBindingService.h ws/soapBar_USCOREBindingService.cpp ws/soapH.h ws/soapC.cpp ws/soapStub.h)
add_custom_command(OUTPUT ${GEN_WS_SOURCES}
COMMAND wsdl2h -o ${CMAKE_BINARY_DIR}/src/generated/c++/ws/Bar.h -t wsdl/typemap.dat wsdl/bar.wsdl
COMMAND soapcpp2 -Lwxi -I/usr/include/gsoap ${CMAKE_BINARY_DIR}/src/generated/c++/ws/Bar.h -d ${CMAKE_BINARY_DIR}/src/generated/c++/ws
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
add_library(GEN_WS ${GEN_WS_SOURCES})

Кажется, все работает правильно, источники создаются. Но при связывании приложения я получаю много ошибок, таких как

undefined reference to `soap_end'
undefined reference to `soap_sender_fault'
more undefined references to `soap_sender_fault' follow

Если я скомпилирую с make VERBOSE=1, Я вижу это -lgsoap++ передается /usr/bin/c++ при связывании. Другие библиотеки, на которые я ссылаюсь, не выдают никаких ошибок, но по какой-то причине компоновщик, похоже, не находит функции gsoap. Библиотека присутствует, и нет ошибки, что компоновщик не может ее найти.

Старый, нестандартный скрипт сборки работал как положено; это также только что прошло -lgsoap++ компоновщику. Единственное реальное отличие, которое я вижу, состоит в том, что моя сборка cmake группирует источники в статические библиотеки, прежде чем пытаться связать все вместе. Но я не понимаю, как это может привести к тому, что все символы из библиотеки не будут найдены.

В чем здесь проблема? Почему компоновщик не может найти символы gsoap?

Хост ОС — это Debian.

Редактировать: Это полная команда компоновщика, выполняемая cmake:

/usr/bin/c++   -w -Wall -pedantic -fdata-sections -ffunction-sections -std=c++0x
-lgsoap++ -lsoci_core -lsoci_sqlite3 -lmicrohttpd -lfetcp -lfeisc -lFedmIscCore
-lboost_system -lboost_thread -lboost_program_options -lboost_date_time
-lboost_unit_test_framework  CMakeFiles/bar.dir/main.cpp.o
CMakeFiles/bar.dir/mainapp.cpp.o  -o bar -rdynamic ../../libs/c++/libLIB_JSONXX.a
../../libs/c++/libLIB_CONFIG.a ../../libs/c++/libLIB_DB.a ../../libs/c++/libLIB_OBID.a
../../libs/c++/libLIB_HELPER.a ../../generated/c++/libGEN_WS.a
../../generated/c++/libGEN_DB.a ../../generated/c++/libGEN_CONFIG.a
libMAIN_CONTROLLERS.a libMAIN_HARDWARE.a libMAIN_HELPER.a libMAIN_MODEL.a
libMAIN_NETWORK.a libMAIN_SYSTEM.a ../../generated/c++/libGEN_DB.a
../../libs/c++/libLIB_DB.a ../../generated/c++/libGEN_CONFIG.a
../../libs/c++/libLIB_JSONXX.a ../../libs/c++/libLIB_CONFIG.a
../../libs/c++/libLIB_HELPER.a ../../libs/c++/libLIB_OBID.a
../../generated/c++/libGEN_WS.a

0

Решение

Я не уверен, что это решит вашу проблему напрямую, но это:

set(CMAKE_CXX_LINK_FLAGS "-lgsoap++ ... [other flags]")

Должно быть:

set(CMAKE_CXX_LINK_FLAGS "[other flags]")
target_link_library(GEN_WS gsoap++) # after add_library of course
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]