【发布时间】: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)而不明确指定要选择的名称等。这基本上是我在这里设置的唯一区别。