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_libary
和swig_add_library
都定义了具有相同名称的目标。这不允许我将C / C ++“手工制作”代码和swig生成的代码添加到同一个库中。使用CMake将SWIG生成的C / C ++添加到同一个库的正确方法是什么?
答案 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