6

私は Cmake が初めてで、コンパイル時にいくつかのファイルを生成する必要があります。生成したら、ファイルをコンパイルしてリンクする必要があります。次のような既に生成されたファイルをコンパイルするためのcmake makefileを作成しました

cmake_minimum_required(VERSION 2.6)
project(demo)
set(CMAKE_CXX_FLAGS "-DWITH_COOKIES")
add_library(soapC soapC.cpp soapVimBindingProxy.cpp)
add_library(stdsoap2  /home/abdullah/installs/gsoap-shah_edits/gsoap/stdsoap2.cpp)
add_executable(demo test_file.cc test_app.cc)
target_link_libraries(demo soapC stdsoap2 gsoap++)

これにより、プロジェクトが正常にコンパイルされます。ただし、soapC.cpp soapVimBindingProxy.cpp最初にファイルを生成する必要があります。そして、gsoap ツールを使用して実行時にこれらのファイルを生成したいと考えています。

以下は、ヘッダーファイルを生成するために実行する必要があるコマンドです

wsdl2h -o outfile.h infile.wsdl

これは、入力 wsdl ファイルを受け取り、対応する outfile.h を作成します。今、私はこのようなcmakeでこれをやってみました

cmake_minimum_required(VERSION 2.6)
add_custom_command(
OUTPUT vsphere.h
COMMAND wsdl2h -o vsphere.h vim25/vim.wsdl
) 

しかし、ここで何かがうまくいかない。エラーは表示されませんが、ファイルも作成されません。何か不足していますか?すべての助けに感謝します。ありがとう。

4

2 に答える 2

9

ヘッダー ファイルを作成するためのコマンドを作成したので、CMake はどこから取得すればよいかを認識しますvsphere.hOUTPUT ${CMAKE_CURRENT_BINARY_DIR}/vsphere.h通話での使用をお勧めしadd_custom_command()ます。

次に、ターゲットを作成する必要があります。

add_custom_target(vsphere_header ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/vsphere.h)

最後に、soapCターゲットをそれに依存させます。

add_dependencies(soapC vsphere_header)

必ずターゲット定義のadd_dependencies()後に呼び出しを行ってください。soapC

于 2012-07-09T06:59:29.510 に答える
3

この問題に光を当ててくれた arododger と TobyHijzen に感謝します。

この問題を解決するには、add_custom_command を main_dependency 機能と共に使用します。以下は、gsoap チュートリアルの有名な計算例の CMakeLists.txt です。

cmake_minimum_required(VERSION 2.8)

# Proejct name
PROJECT(Calculator)

# Make verbose level on/off
SET(CMAKE_VERBOSE_MAKEFILE ON)

# Varialbes used in cmake
SET(TARGET calc_client)
SET(GSOAP_STATIC_LIB gsoap)

SET(CLIENT_SRC calc_client.c)

SET(WSDL2H_EXEC wsdl2h)
SET(WSDL2H_IN http://www.genivia.com/calc.wsdl)
#SET(WSDL2H_IN calc.wsdl)
SET(WSDL2H_OUT calc.h)
SET(WSDL2H_OPT -c -o)

# command for generating stub and xml serializer code
ADD_CUSTOM_COMMAND(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${WSDL2H_OUT}
    COMMAND ${WSDL2H_EXEC} -c -ttypemap.dat -o ${WSDL2H_OUT} ${WSDL2H_IN}
    COMMENT "=================== Generating ${WSDL2H_OUT} gSOAP Header file ..."
)

SET(SOAPCPP2_EXEC soapcpp2)
SET(STUB soapClient.c soapC.c)

SET(SOAPCPP2_OUT
    ${STUB}
    calc.add.req.xml
    calc.add.res.xml
    calc.sub.req.xml
    calc.sub.res.xml
    calc.mul.req.xml
    calc.mul.res.xml
    calc.div.res.xml
    calc.div.req.xml
    calc.pow.res.xml
    calc.pow.req.xml
    calc.nsmap
    soapH.c
    soapH.h
    soapStub.h
    soapClientLib.c
)
# command for generating stub and xml serializer code
ADD_CUSTOM_COMMAND(
    OUTPUT ${STUB}
    COMMAND ${SOAPCPP2_EXEC} -c -C ${WSDL2H_OUT}
    MAIN_DEPENDENCY ${WSDL2H_OUT}
    COMMENT "=================== Generating ${STUB} outputs ..."
)


# Exutable files and dependents
ADD_EXECUTABLE(${TARGET} ${CLIENT_SRC} ${STUB})

# libraries for taget : for gcc -l option
TARGET_LINK_LIBRARIES(${TARGET} ${GSOAP_STATIC_LIB})

# Compiler options
ADD_DEFINITIONS(-Wall -O2 -s)
于 2015-04-14T02:17:16.043 に答える