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

