gcc未与gsoap正确链接 < >我正在移植C++应用程序生成系统到CGUID。一个依赖项是gsoap++,它生成一个SOAP服务和客户机。要链接到它,我指定 set(CMAKE_CXX_LINK_FLAGS "-lgsoap++ ... [other flags]")

gcc未与gsoap正确链接 < >我正在移植C++应用程序生成系统到CGUID。一个依赖项是gsoap++,它生成一个SOAP服务和客户机。要链接到它,我指定 set(CMAKE_CXX_LINK_FLAGS "-lgsoap++ ... [other flags]"),c++,linker,cmake,gsoap,gcc4.4,C++,Linker,Cmake,Gsoap,Gcc4.4,在根目录中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/so

在根目录中
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

我不确定它是否能直接解决您的问题,但这:

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

您是否验证了它丢失的符号确实存在于您试图链接的库中?可能存在@Plasmah的重复项是的,我在
libgsoap++.a
中搜索了
nm
,并在那里定义了符号。查看设置LD\u DEBUG时是否有任何提示@flyx:您可能希望提供用于链接的确切命令行。这实际上解决了问题。它将
-lgsoap++
移动到链接器命令的末尾。我真的很想知道为什么链接器的行为会根据传递的参数的顺序而有所不同。太好了,这就是我所希望的。是的,您的链接器是单通道的,这意味着顺序确实很重要,就像许多链接器一样。