【问题标题】:SWIG Cmake inconsistent DLL linkageSWIG Cmake 不一致的 DLL 链接
【发布时间】:2016-08-16 09:49:31
【问题描述】:

我正在使用 CMake 将 c++ 项目构建为 Windows 上的 DLL。然后我希望使用 SWIG 为 python 包装它,但这样做我收到有关“不一致的 DLL 链接”的警告。我认为这指的是 dllexport/dllimport 的错误使用,我需要为 SWIG 指定 #define?如何在 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 来生成导出标头)。

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

include(FindGTest)
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

# If *nix, pthread must be specified *after* the googletest libs
if(WIN32)
  set (PTHREAD "")
else(WIN32)
  set (PTHREAD pthread)
endif(WIN32)

add_executable(galgtest test/galg_unittest.cpp)
target_link_libraries(galgtest ${GTEST_BOTH_LIBRARIES} galgcore galgfunc ${PTHREAD})
add_test(AllTestsInGalg galgtest "${CMAKE_CURRENT_LIST_DIR}/test/10_12_1.tif")

最后是关于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)

【问题讨论】:

  • SOURCES 在哪里定义?您能否详细说明哪些功能会给您错误的链接,例如圆形
  • @JensMunk 我遇到的唯一问题是 SWIG 函数 (SWIG_LINK_LIBRARIES)。如果我评论它工作正常(尽管,ofc,没有产生 swig 模块)。你可以在我粘贴的第一个代码块的第一行看到SOURCES
  • 会不会是你的 python 库是 32 位的,而你正在构建一个 64 位的 DLL?如果你让你的 galgcore 库是静态的会发生什么?
  • 不,我只有 64 位 python。 Inconsistent DLL linkage 据我所知,通常与错误的 dllexport/dllimport 定义有关。我的问题是这是由 CMake 自动处理的,所以我需要以某种方式告诉 CMake/Swig 使用正确的定义...
  • 我已经这样做了数千次,但我通常会使用IGENERATE_EXPORT_HEADER( galgcore) 而不明确指定要选择的名称等。这基本上是我在这里设置的唯一区别。

标签: python c++ dll cmake swig


【解决方案1】:

这是我为完全避免在 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()

【讨论】:

  • 谢谢。我在 CMake 文件中进行了一些更改,并在接口文件中进行了一些更改,现在它正在工作:)
  • 很高兴听到这个消息。如果您使用的是 MSVC,我认为您将受益于上述技巧以使调试工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多