SWIG Cmake 不一致的DLL链接

2024-06-16 09:05:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用CMake在Windows上构建一个DLL的c++项目。然后我希望使用SWIG为python包装这个,但是这样做时,我收到了关于“不一致的DLL链接”的警告。我想这是因为dllexport/dllimport用法不正确,我需要为SWIG指定一个定义?我在CMake怎么做?在

我的C++库是在CMake中构建的:

# glob all the sources
file(GLOB SOURCES "src/core/*.cpp")

add_library(galgcore SHARED ${SOURCES})
target_link_libraries(galgcore ${GDAL_LIBRARY})

GENERATE_EXPORT_HEADER( galgcore
             BASE_NAME GeoAlg
             EXPORT_MACRO_NAME GALGCORE_DLL
             EXPORT_FILE_NAME ${PROJECT_SOURCE_DIR}/src/core/core_exp.h
             STATIC_DEFINE GeoAlg_BUILT_AS_STATIC
)

(它正在使用CMAke生成导出头)。在

我使用这个库来构建一个运行良好的测试可执行文件:

^{pr2}$

最后,关于swig的部分:

### SWIG
# This generates the python bindings
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})

find_package(PythonLibs)
include_directories(${PYTHON_INCLUDE_PATH})

set(CMAKE_SWIG_FLAGS "-Wall")
set_source_files_properties("${PROJECT_SOURCE_DIR}/python/galg.i" PROPERTIES CPLUSPLUS ON)
set_property(SOURCE "${PROJECT_SOURCE_DIR}/python/galg.i" PROPERTY SWIG_FLAGS "-builtin")
SWIG_ADD_MODULE(galg python "${PROJECT_SOURCE_DIR}/python/galg.i" ${SOURCES})
SWIG_LINK_LIBRARIES(galg ${PYTHON_LIBRARIES} galgcore)

Tags: thenamecoresrcprojectcmakesourcedir
1条回答
网友
1楼 · 发布于 2024-06-16 09:05:27

下面是我如何避免在Windows上出现警告的完整方法:

# We don't have Python with debug information installed
if (MSVC)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127")
  add_definitions(-DSWIG_PYTHON_INTERPRETER_NO_DEBUG)
endif()

find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})

find_package(PythonLibs REQUIRED)

include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR}) # generated files

if (MSVC)
  set(CMAKE_SWIG_FLAGS "-D_SWIG_WIN32")
endif()

set_source_files_properties(swig_project.i PROPERTIES CPLUSPLUS ON)
swig_add_module(swig_project python swig_project.i ${swig_project_HEADERS})

if (MSVC)
  # Potential uninitialized variable in SWIG_AsVal_
  set_source_files_properties( ${swig_generated_file_fullname} PROPERTIES COMPILE_FLAGS "/wd4701")
endif()

if (WIN32)
  # Allow to debug under windows, if debug versions of Python are missing
  string(REPLACE "_d" "" PYTHON_LIBRARIES "${PYTHON_LIBRARIES}")
endif()

swig_link_libraries(swig_project project ${PYTHON_LIBRARIES})

if (WIN32)
  # pyconfig.h is not autogenerated on Windows. To avoid warnings, we
  # add a compiler directive
  get_directory_property(DirDefs COMPILE_DEFINITIONS )
  set_target_properties(_swig_project PROPERTIES
  COMPILE_DEFINITIONS "${DirDefs};HAVE_ROUND")
endif()

相关问题 更多 >