2016-10-14 3 views
1

Доброе утро, все,CMake, SWIG & общая библиотека

Я связываюсь с вами, потому что у меня проблема. Я использую CMake для компиляции и сборки динамической библиотеки C++/C# оболочки SWIG. Эта оболочка позволяет мне использовать DLL C++ с программой выполнения C#.

Я хотел бы быть готовым запустить CTEST в своей библиотеке, чтобы убедиться, что у меня нет ошибок. Проблема с библиотекой «Windows» заключается в том, что вам нужно экспортировать символ, чтобы использовать его. С обычной библиотеки, я добавлю команду «Shared» в «add_library»:

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

Но чтобы построить библиотеку бросил SWIG мне нужно использовать «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_NAME}Tester SHARED ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS}) 
generate_export_header(${PROJECT_NAME}Tester EXPORT_MACRO_NAME OTHER_NAME_EXPORT) 

Я хотел бы найти способ, чтобы построить только один и пригодны для использования обоих. Спасибо за вашу помощь и иметь хороший уик-энд, Климент

+1

Я столкнулся с той же проблемой, и в итоге у меня были две библиотеки, а не одна. Он имеет преимущество перед наличием многофункционального устройства: с помощью SWIG вы можете создавать множество оберток для многих языков. В конце концов, я предпочел иметь одну библиотеку-оболочку для каждого языка, так как вам нужны символы C#, только если вы используете оболочку C#, символы python, если используете оболочку python и т. Д. И т. Д. Итак, если, например, ваша библиотека C++ полезна многим людям , они (или вы) можете просто написать новый модуль-оболочку, вместо того, чтобы перекомпилировать все, и сохранить основную библиотеку отделенной и независимой от оболочек. – fedino

+0

То же самое здесь, полностью согласен с @fedino, это предпочтительный подход – Schollii

ответ

0

@fedino @Scollii Спасибо за ваши ответы, я, наконец, решить мою проблему путем создания макроса в CMake, который compilling * .o из Swig команды и использования он возвращается в «add_library». С этим решением у меня есть реальная библиотека SHARED, которую я могу использовать для моего теста.

Смежные вопросы