2014-01-16 5 views
0

저는 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 
+0

누락 된 기호가 실제로 있음을 확인 했습니까? 당신이 연결하려고하는 도서관에 있습니까? – PlasmaHH

+0

[정의되지 않은 참조/확인되지 않은 외부 기호 오류 란 무엇이며 어떻게 수정합니까?] (http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- symbol-error-and-do-do-i-fix) – PlasmaHH

+0

@PlasmaHH 네,'libgsoap ++. a'에서'nm'으로 검색했고 거기에 심볼이 정의되어 있습니다. – flyx

답변

2

하지만,이 :

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 
+1

이것은 실제로 문제를 해결합니다. '-lgsoap ++ '를 링커 명령의 마지막으로 이동시킨다. 나는 링커의 행동이 전달 된 인자의 순서에 따라 왜 다른지 정말로 궁금해한다. – flyx

+0

참조 : http://stackoverflow.com/questions/45135/linker-order-gcc – Jackson

+0

위대한, 그게 내가 기대했던 것입니다. 예, 링커가 단일 패스이므로 여러 링커의 경우와 마찬가지로 순서가 중요합니다. –