Windows10下Swig4.2.1生成包装器时无法找到标准库文件
问题:Windows下SWIG生成C#包装器时找不到标准库文件
在Windows 10 + SWIG 4.2.1环境下,尝试使用自定义类型的std::vector生成C++到C#的包装器文件,编译时提示无法找到iostream、vector等标准库头文件。问题在引入%include <std_vector.i>后出现,已设置SWIG的Lib文件夹路径,需排查写法或配置错误。
相关文件内容
CMakeLists.txt
cmake_minimum_required(VERSION 3.16) project(TrajPlanProj VERSION 0.0.0 LANGUAGES CXX) set(CMAKE_DEBUG_POSTFIX "d") ##########################swig############################### if ( MSVC ) set(SWIG_DIR "C:\\Program Files\\swigwin-4.2.1\\Lib") set(SWIG_EXECUTABLE "C:\\Program Files\\swigwin-4.2.1\\swig.exe") endif (MSVC) find_package(SWIG REQUIRED) include(${SWIG_USE_FILE}) # Set .Net project directory # set(NET_PROJECT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../CSharpSide") set(NET_PROJECT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") # Add swig flags here set(CMAKE_SWIG_FLAGS "") set_property(SOURCE TrajPlan.i PROPERTY CPLUSPLUS ON) set_source_files_properties(TrajPlan.i PROPERTIES SWIG_FLAGS "-includeall") swig_add_library(TrajPlan TYPE SHARED LANGUAGE CSharp SOURCES TrajPlan.i TrajPlan.h OUTPUT_DIR ${NET_PROJECT_DIR} OUTFILE_DIR ${NET_PROJECT_DIR} ) set_property(TARGET TrajPlan PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) # for copying TrajPlan.dll to .Net project dir dir set_target_properties( TrajPlan PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${NET_PROJECT_DIR} RUNTIME_OUTPUT_DIRECTORY_DEBUG ${NET_PROJECT_DIR} LIBRARY_OUTPUT_DIRECTORY ${NET_PROJECT_DIR} # Set address of C++ headers INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR} )
TrajPlan.h
#pragma once #include <iostream> #include <vector> struct Point { float x; float y; float z; }; int addPoints(std::vector<Point> points){ for(const auto& point : points){ std::cout << "x: " << point.x << ", y: " << point.y << ", z: " << point.z << std::endl; } return 0; }
TrajPlan.i
%module TrajPlanModule %{ #include "TrajPlan.h" %} %include <std_vector.i> %template(PointVector) std::vector<Point>;; %include "TrajPlan.h"
报错信息
[build] C:\program_on_git\SFR\trajplan\CppSide\TrajPlan.h(2): error : Unable to find 'iostream' [C:\program_on_git\SFR\trajplan\CppSide\out\build\vs+vcpkg\TrajPlan.vcxproj] [build] C:\program_on_git\SFR\trajplan\CppSide\TrajPlan.h(3): error : Unable to find 'vector' [C:\program_on_git\SFR\trajplan\CppSide\out\build\vs+vcpkg\TrajPlan.vcxproj]
问题原因与解决方法
1. CMake未正确传递系统标准库路径给SWIG
SWIG解析C++头文件时需要访问系统标准库路径,当前配置中INCLUDE_DIRECTORIES的设置方式可能未让SWIG获取到MSVC的标准库位置。
修复方式:
将set_target_properties中的INCLUDE_DIRECTORIES替换为target_include_directories,确保CMake正确传递包含路径:
# 替换原set_target_properties中的INCLUDE_DIRECTORIES设置 target_include_directories(TrajPlan PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
2. swig_flags的-includeall参数导致解析范围异常
-includeall会强制SWIG解析所有引入的头文件,包括系统库,但如果SWIG找不到系统库路径就会触发报错。
修复方式:
移除该参数,修改CMake中的SWIG_FLAGS设置:
set_source_files_properties(TrajPlan.i PROPERTIES SWIG_FLAGS "")
3. 调整std_vector.i与头文件的引入顺序
先让SWIG识别自定义结构体Point,再定义std::vector模板,避免解析顺序问题:
%module TrajPlanModule %{ #include "TrajPlan.h" %} %include "TrajPlan.h" %include <std_vector.i> %template(PointVector) std::vector<Point>;
4. 确认SWIG Lib路径有效性
检查SWIG_DIR指向的C:\\Program Files\\swigwin-4.2.1\\Lib目录下是否存在std_vector.i文件,确保路径配置正确。
内容的提问来源于stack exchange,提问作者Qiuren
相关产品推荐
相关产品推荐

