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
相关产品推荐
相关产品推荐

