【问题标题】:gcc does not link properly against gsoapgcc 没有正确链接到 gsoap
【发布时间】:2014-01-16 10:09:08
【问题描述】:

我正在将我的 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

【问题讨论】:

标签: c++ linker cmake gsoap gcc4.4


【解决方案1】:

我不确定它是否会直接解决你的问题,但是这个:

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

【讨论】:

  • 这实际上解决了问题。它将-lgsoap++ 移动到链接器命令的末尾。我真的很想知道为什么链接器的行为会根据传递的参数的顺序而有所不同。
  • 太好了,这就是我希望发生的事情。是的,您的链接器是单通道的,这意味着顺序确实很重要,就像许多链接器一样。
猜你喜欢
  • 2023-03-30
  • 2012-03-21
  • 2018-08-20
  • 2011-08-06
  • 1970-01-01
  • 2013-11-06
  • 2016-12-29
  • 1970-01-01
  • 2018-08-07
相关资源
最近更新 更多