CMake、SWIG 和共享库

Posted

技术标签:

【中文标题】CMake、SWIG 和共享库【英文标题】:CMake, SWIG & shared library 【发布时间】:2016-10-14 08:05:21 【问题描述】:

大家早上好,

我与您联系是因为我遇到了问题。 我正在使用 CMake 编译和构建 SWIG 包装器 C++/C# 动态库。 这个包装器允许我将 DLL C++ 与 C# 执行程序一起使用。

我希望能够在我的库上启动 CTEST 以验证我没有错误。 “Windows”库的问题是您需要导出符号才能使用它。 使用常用库,我将命令“SHARED”添加到“add_library”:

add_library( $PROJECT_NAME SHARED $$PROJECT_NAME_SOURCES $$PROJECT_NAME_HEADERS )

但是要构建抛出 SWIG 的库,我需要使用不知道命令“SHARED”的“SWIG_ADD_MODULE”。

我找到的唯一解决方案是创建两个库。 一个由 SWIG 构建并由 C# 代码使用。 第二个构建通常使用“add_library”并由我的 CTEST 程序使用。 这是我的 CMakeList :

###############################
# SWIG LYBRARY
###############################
include(GenerateExportHeader)
SET (MODULE_NAME     Mylib)
SET (INTERFACE_FILES Mylib.i)

FIND_PACKAGE(SWIG REQUIRED)
INCLUDE($SWIG_USE_FILE)

INCLUDE_DIRECTORIES($CMAKE_CURRENT_SOURCE_DIR)

# call swig as:  'swig -csharp -c++ -outdir XXX'
SET_SOURCE_FILES_PROPERTIES($INTERFACE_FILES PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES($INTERFACE_FILES PROPERTIES SWIG_FLAGS "-includeall")

SWIG_ADD_MODULE($MODULE_NAME csharp $INTERFACE_FILES $$PROJECT_NAME_SOURCES  $$PROJECT_NAME_HEADERS )
SWIG_LINK_LIBRARIES($MODULE_NAME $CSHARP_LIBRARIES)
###############################
# DYNAMIC LYBRARY
###############################
add_library( $PROJECT_NAMETester SHARED $$PROJECT_NAME_SOURCES $$PROJECT_NAME_HEADERS )
generate_export_header($PROJECT_NAMETester EXPORT_MACRO_NAME OTHER_NAME_EXPORT)

我希望我能找到一种方法来构建一个并且两者都可以使用。 感谢您的帮助,祝您周末愉快, 克莱门特

【问题讨论】:

我遇到了同样的问题,最终得到了两个库而不是一个,就像你一样。与一体机相比,它有一个优势:使用 SWIG,您可以为多种语言创建许多包装器。最后,我更喜欢为每种语言都有一个包装库,因为只有在使用 C# 包装器时才需要 C# 符号,如果使用 python 包装器则需要 python 符号等。所以,例如,如果你的 C++ 库对很多人有用,他们(或您)可以只编写一个新的包装器模块,而不是重新编译所有内容,并保持核心库与包装器分离和独立。 这里也一样,完全同意@fedino,这是首选方法 【参考方案1】:

@fedino @Scollii 感谢您的回答,最后我通过在 CMake 中创建一个宏来解决我的问题,该宏编译 swig 命令的 *.o 并将其重新用于“add_library”。有了这个解决方案,我就有了一个真正的 SHARED 库,可用于我的测试。

【讨论】:

以上是关于CMake、SWIG 和共享库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SWIG 在进程和调用脚本子进程之间共享库?

在 perl 中调试由 SWIG 包装的共享库

使用 Cmake 创建一个依赖于 dlib 的共享库

CMake第三课--安装自己编写的头文件和共享库

CMake 添加和删除宏定义以编译共享库/可执行文件

CMake:如何从子项目的所有静态库中创建一个共享库?