简体   繁体   English

CMake,SWIG和共享库

[英]CMake, SWIG & shared library

Good Morning everyone, 大家,早安,

I contact you because I am stuck on a problem. 我联系你是因为我遇到了问题。 I am using CMake to compile and build a SWIG wrapper C++/C# dynamic library. 我正在使用CMake编译和构建SWIG包装器C ++ / C#动态库。 This wrapper allows me to use a DLL C++ with a C# execute program. 这个包装器允许我使用带有C#执行程序的DLL C ++。

I would like to be abble to launch CTEST on my library to verify that I have no bug. 我想能够在我的库上启动CTEST以验证我没有错误。 The problem with "Windows" library is that you need to export the symbol to be abble to use it. “Windows”库的问题是您需要导出符号才能使用它。 With a usual library, I will add the command "SHARED" to the "add_library" : 使用通常的库,我将命令“SHARED”添加到“add_library”:

add_library( ${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS} )

But to build the library threw SWIG I need to use "SWIG_ADD_MODULE" which doesn't know the command "SHARED". 但是要构建库扔SWIG我需要使用“SWIG_ADD_MODULE”,它不知道命令“SHARED”。

The only solution that I have found yet, it's to create two libraries. 我发现的唯一解决方案是创建两个库。 One builds by SWIG and used by the C# code. 一个由SWIG构建并由C#代码使用。 The second builds usually with "add_library" and used by my CTEST program. 第二个版本通常使用“add_library”并由我的CTEST程序使用。 This is my CMakeList : 这是我的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_NAME}Tester SHARED ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS} )
generate_export_header(${PROJECT_NAME}Tester EXPORT_MACRO_NAME OTHER_NAME_EXPORT)

I wish I could find a way to build only one and useable by both. 我希望我能找到一种方法来构建一个并且两者都可用。 Thanks for your help and have a nice weekend, Clément 谢谢你的帮助,周末愉快,克莱门特

@fedino @Scollii Thanks for your answers, finally I have solved my problem by creating a macro in CMake which compilling the *.o of the swig command and use it back into the "add_library". @fedino @Scollii感谢您的回答,最后我通过在CMake中创建一个宏来解决我的问题,该宏填充swig命令的* .o并将其用回“add_library”。 With that solution I have a real SHARED library that I can use for my test. 有了这个解决方案,我有一个真正的SHARED库,我可以用它进行测试。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM