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

Makefile配置项目链接依赖库出现Error LNK2019如何解决

问题根因

你当前写的Makefile仅定义了一个变量,没有声明任何构建目标、编译规则、链接参数,nmake找不到可执行的默认目标时不会触发任何编译链接动作,仅输出版本信息就是这个表现。后续出现的LNK2019 unresolved external symbol错误,本质是链接阶段根本没有将jvm.lib作为输入项传给链接器,JNI相关的API符号找不到定义。
另外你之前写的JDK路径在Program Files目录下带空格,没有加引号的话nmake会把路径截断成C:\Program,配置直接失效。

适配nmake的正确Makefile配置

以下配置可直接用于VS自带的nmake构建C++调用Java的JNI项目,注意替换成你自己的源文件名即可:

# JDK路径配置,带空格的路径必须用双引号包裹
JDK_HOME = "C:\Program Files\Java\jdk1.8.0_333"
JDK_INCLUDE = $(JDK_HOME)\include
JDK_INCLUDE_WIN32 = $(JDK_HOME)\include\win32
JVM_LIB = $(JDK_HOME)\lib\jvm.lib

# 编译配置
CC = cl
TARGET = jni_call_java.exe  # 替换为你要生成的可执行文件名
SRCS = main.cpp  # 替换为你的C++源文件,多个文件用空格分隔
CFLAGS = /I$(JDK_INCLUDE) /I$(JDK_INCLUDE_WIN32) /EHsc
LDFLAGS = $(JVM_LIB)

# 默认构建目标
all: $(TARGET)

# 编译链接规则:注意这一行开头必须是单个Tab制表符,不能用空格
$(TARGET): $(SRCS)
	$(CC) $(CFLAGS) $(SRCS) /Fe:$(TARGET) $(LDFLAGS)

# 清理编译产物规则:同样开头必须是Tab
clean:
	del $(TARGET) *.obj
构建注意事项
  • 打开对应VS版本的原生工具命令提示符时,必须保证架构和你安装的JDK一致:64位JDK要开x64 Native Tools Command Prompt,32位JDK开x86版本的命令行,架构不匹配会直接报链接错误
  • 执行nmake命令前要切换到Makefile和源码所在的目录
  • 编译成功后运行程序前,需要把jvm.dll所在路径(默认是C:\Program Files\Java\jdk1.8.0_333\jre\bin\server)加入系统PATH环境变量,否则运行时会提示找不到jvm.dll
  • Makefile中所有写编译、清理命令的行,开头必须是单个Tab缩进,用空格缩进nmake会直接报语法错误

内容的提问来源于stack exchange,提问作者user19405069

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:54:21