如何使用cmake

时间:2018-02-15 08:12:58

标签: cmake swig

CMake的SWIG插件目前令我感到困惑。我想构建一个包含可直接从C / C ++代码编译的可执行代码的单个共享对象,以及间接从输入文件到swig的编译。

在我的CMakeLists.txt文件中,我有

file (GLOB SOURCES ./src/ice/ice/*.c ./src/ice/ice/*.cpp)
add_library (ice SHARED ${SOURCES})
target_include_directories (ice PUBLIC ./bld/build/gen)
...
set_property(SOURCE ./src/ice/ice/ice_swig.i PROPERTY CPLUSPLUS ON) 
swig_add_library (ice LANGUAGE tcl SOURCES ./src/ice/ice/ice_swig.i ) 
...

在配置期间,我收到此错误:

  

/public/public64/packages/development/cmake-3.8.1/share/cmake-3.8/Modules/UseSWIG.cmake:275中的CMake错误   (add_library):
          add_library无法创建目标“ice”,因为另一个目标与           同名已经存在。现有目标是在中创建的共享库           源目录“/ home / steve / cmake_games / src / ice / ice”。
  有关更多详细信息,请参阅策略CMP0002的文档。           调用堆栈(最近一次调用):src / ice / ice / CMakeLists.txt:20(swig_add_library)
   - 配置不完整,发生错误!

似乎add_libaryswig_add_library都定义了具有相同名称的目标。这不允许我将C / C ++“手工制作”代码和swig生成的代码添加到同一个库中。使用CMake将SWIG生成的C / C ++添加到同一个库的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

我们通过创建子库并将其与SWIG库链接来解决这个问题:

file (GLOB SOURCES ./src/ice/ice/*.c ./src/ice/ice/*.cpp)
add_library (ice_baby SHARED ${SOURCES})
target_include_directories (ice_baby PUBLIC ./bld/build/gen)
...
set_property(SOURCE ./src/ice/ice/ice_swig.i PROPERTY CPLUSPLUS ON) 
swig_add_library (ice LANGUAGE tcl SOURCES ./src/ice/ice/ice_swig.i ) 
swig_link_libraries (ice ice_baby)
...

答案 1 :(得分:-1)

您应该使用UseSWIG

的新语法

第一

swig_add_library (ice_tcl
TYPE STATIC
LANGUAGE tcl
SOURCES ./src/ice/ice/ice_swig.i) 

然后尝试添加:

target_link_library(ice PRIVATE ${SWIG_MODULE_ice_tcl_REAL_NAME})

ps:不确定swig生成的tcl文件是否会尝试直接打开ice_tcl库... 在这种情况下,您需要两个像这样的库:https://github.com/Mizux/cmake-swig