You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:44:51