저는 Cake 응용 프로그램 빌드 시스템을 cmake로 마이그레이션하려고합니다. 한 가지 종속성은 SOAP 서비스와 클라이언트를 생성하는 gsoap ++입니다. 링크하려면gcc가 gsoap과 제대로 연결되지 않습니다.
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})
모든 것이 제대로 작동하고 소스가 생성됩니다. 응용 프로그램을 링크 할 때 내가 make VERBOSE=1
컴파일하면, 나는 내가 링크 할 때 -lgsoap++
이 에 전달되는 것을 볼,
undefined reference to `soap_end'
undefined reference to `soap_sender_fault'
more undefined references to `soap_sender_fault' follow
같은 오류를 많이 얻을. 링크 된 다른 라이브러리는 에러를 발생시키지 않지만, 어떤 이유로 링커는 gsoap의 기능을 찾지 못하는 것 같습니다. 라이브러리가 있으며 링커가 찾을 수없는 오류가 없습니다.
이전의 사용자 지정 빌드 스크립트가 예상대로 작동했습니다. 그것은 또한 단지 -lgsoap++
을 링커에게 넘겼습니다. 내가 보는 유일한 차이점은, 모든 것을 연결하기 전에, 내 cmake 빌드는 소스를 정적 라이브러리로 그룹화한다는 것입니다. 그러나 이것이 어떻게 도서관의 모든 상징이 발견되지 않는지 알 수는 없습니다.
여기에 문제가 있습니까? 링커가 gsoap의 심볼을 찾을 수없는 이유는 무엇입니까?
호스트 OS는 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
누락 된 기호가 실제로 있음을 확인 했습니까? 당신이 연결하려고하는 도서관에 있습니까? – PlasmaHH
[정의되지 않은 참조/확인되지 않은 외부 기호 오류 란 무엇이며 어떻게 수정합니까?] (http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- symbol-error-and-do-do-i-fix) – PlasmaHH
@PlasmaHH 네,'libgsoap ++. a'에서'nm'으로 검색했고 거기에 심볼이 정의되어 있습니다. – flyx