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

Windows下GCC无法加载Julia库函数:C调用Julia遇未定义引用问题

问题:Windows下C调用Julia出现未定义引用错误

在Windows系统中尝试从C语言调用Julia函数,严格遵循官方文档操作,但编译时始终出现Julia相关函数_imp__jl_init、_imp__jl_eval_string、_imp__jl_atexit_hook的未定义引用错误。

测试代码

#include <julia.h>
JULIA_DEFINE_FAST_TLS // only define this once, in an executable (not in a shared library) if you want fast code.

int main(int argc, char *argv[])
{
    /* required: setup the Julia context */
    jl_init();

    /* run Julia commands */
    jl_eval_string("print(sqrt(2.0))");

    /* strongly recommended: notify Julia that the
         program is about to terminate. this allows
         Julia time to cleanup pending write requests
         and run all finalizers
    */
    jl_atexit_hook(0);
    return 0;
}

编译命令

gcc -v -o test -march=pentium4 -I%JULIA_DIR%\include\julia -L%JULIA_DIR%\lib test.c -ljulia

完整编译日志

C:\Users\SComiati\OneDrive - DXC Production\Documents\c-code>gcc -v -o test -march=pentium4 -I%JULIA_DIR%\include\julia -L%JULIA_DIR%\lib test.c -ljulia
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --with-gmp=/mingw --with-mpfr --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --enable-libgomp --disable-libvtv --enable-nls
Thread model: win32
gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
COLLECT_GCC_OPTIONS='-v' '-o' 'test.exe' '-march=pentium4' '-I' 'C:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\include\julia' '-LC:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\lib'
 c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/cc1.exe -quiet -v -I C:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\include\julia 
-iprefix c:\mingw\bin\../lib/gcc/mingw32/6.3.0/ test.c -quiet -dumpbase test.c -march=pentium4 -auxbase test -version -o C:\Users\SComiati\AppData\Local\Temp\ccSKCncc.s
GNU C11 (MinGW.org GCC-6.3.0-1) version 6.3.0 (mingw32)
        compiled by GNU C version 6.3.0, GMP version 6.1.2, MPFR version 3.1.5, MPC version 1.0.3, isl version 0.15
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "c:\mingw\bin\../lib/gcc/mingw32/6.3.0/../../../../mingw32/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/6.3.0/include"
ignoring duplicate directory "/mingw/lib/gcc/mingw32/6.3.0/../../../../include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/6.3.0/include-fixed"
ignoring nonexistent directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/6.3.0/../../../../mingw32/include"
ignoring duplicate directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 C:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\include\julia
 c:\mingw\bin\../lib/gcc/mingw32/6.3.0/include
 c:\mingw\bin\../lib/gcc/mingw32/6.3.0/../../../../include
 c:\mingw\bin\../lib/gcc/mingw32/6.3.0/include-fixed
End of search list.
GNU C11 (MinGW.org GCC-6.3.0-1) version 6.3.0 (mingw32)
        compiled by GNU C version 6.3.0, GMP version 6.1.2, MPFR version 3.1.5, MPC version 1.0.3, isl version 0.15
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 384cad586f05ed581a9c068b2f18b408
COLLECT_GCC_OPTIONS='-v' '-o' 'test.exe' '-march=pentium4' '-I' 'C:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\include\julia' '-LC:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\lib'
 c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/as.exe -v -I C:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\include\julia -o C:\Users\SComiati\AppData\Local\Temp\ccrWC7dD.o C:\Users\SComiati\AppData\Local\Temp\ccSKCncc.s
GNU assembler version 2.28 (mingw32) using BFD version (GNU Binutils) 2.28
COMPILER_PATH=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/;c:/mingw/bin/../libexec/gcc/;c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/
LIBRARY_PATH=c:/mingw/bin/../lib/gcc/mingw32/6.3.0/;c:/mingw/bin/../lib/gcc/;c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/;c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../
COLLECT_GCC_OPTIONS='-v' '-o' 'test.exe' '-march=pentium4' '-I' 'C:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\include\julia' '-LC:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\lib'
 c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/collect2.exe -plugin c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/liblto_plugin-0.dll -plugin-opt=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\SComiati\AppData\Local\Temp\cc24U3oi.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -Bdynamic -o test.exe c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../crt2.o c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtbegin.o -LC:\Users\SComiati\AppData\Local\Programs\Julia-1.11.1\lib -Lc:/mingw/bin/../lib/gcc/mingw32/6.3.0 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../.. C:\Users\SComiati\AppData\Local\Temp\ccrWC7dD.o -ljulia -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtend.o

原因分析

  • 架构不匹配:使用的是32位MinGW(Target: mingw32),但Julia 1.11.1是64位版本,32位编译器无法链接64位的Julia库,导致找不到函数符号。
  • GCC版本过旧:GCC 6.3.0版本与Julia 1.11.x的ABI不兼容,旧版本编译器生成的符号格式无法匹配Julia库中的符号定义。
  • 不必要的编译参数:-march=pentium4是32位架构的优化参数,在64位环境下无效且可能加剧架构冲突。

解决方法

1. 切换到64位MinGW-w64编译器

  • 下载并安装MinGW-w64(64位版本),确保编译器目标架构为x86_64-w64-mingw32。
  • 将MinGW-w64的bin目录添加到系统PATH环境变量最前端,确保优先使用64位编译器。

2. 更新GCC至兼容版本

  • 使用MinGW-w64提供的GCC 9.x或更高版本,保证与Julia 1.11.x的ABI兼容。

3. 修正编译命令

使用64位编译器后,执行以下命令(替换%JULIA_DIR%为你的Julia安装路径):

gcc -o test -I"%JULIA_DIR%\include\julia" -L"%JULIA_DIR%\lib" test.c -ljulia
  • 移除-march=pentium4参数,避免架构冲突。

4. 配置运行时环境

  • 将Julia安装目录下的lib路径添加到系统PATH中,或者将libjulia.dll复制到生成的test.exe同目录下,确保运行时能加载Julia库。

5. 验证架构匹配

使用MinGW-w64的file命令检查生成的可执行文件架构:

file test.exe

输出应包含PE32+ executable (console) x86-64,确认是64位程序。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:49:50