C 从我的makefile运行时忽略库
我建立了自己的图书馆,名为j(创造性)。 我将库放在makefile的目录中。 为了显示我的布局,下面是C 从我的makefile运行时忽略库,c,gcc,makefile,static-libraries,mingw-w64,C,Gcc,Makefile,Static Libraries,Mingw W64,我建立了自己的图书馆,名为j(创造性)。 我将库放在makefile的目录中。 为了显示我的布局,下面是ls-R逐字吐出的内容: a.exe header libj.a makefile src ./header: jlib ./header/jlib: dstring.h eio.h ./src: main.c main.d main.o 当我运行gcc src/main.c-static-L-lj-Iheader-std=c11时,它的链接很好!然而,当我从make
ls-R
逐字吐出的内容:
a.exe header libj.a makefile src
./header:
jlib
./header/jlib:
dstring.h eio.h
./src:
main.c main.d main.o
当我运行gcc src/main.c-static-L-lj-Iheader-std=c11时,它的链接很好!然而,当我从makefile运行我认为是等效的东西时,ld
抱怨缺少符号…我和Mingw-w64在Windows上 这是我的makefile: 这是libj.a的nm
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata
0000000000000000 r .rdata$zzz
0000000000000000 t .text
0000000000000000 r .xdata
U __imp___iob_func
U fprintf
U free
U malloc
U memcpy
U printf
U realloc
U sscanf
U strcpy
000000000000013f T String_append
0000000000000000 T String_construct_d
000000000000004f T String_construct_s
00000000000000ce T String_deconstruct_d
00000000000000fa T String_deconstruct_s
0000000000000286 T String_empty
00000000000002e6 T String_find_after
000000000000025c T String_print
00000000000002a6 T String_touint
0000000000000093 T String_wrap_d
U strlen
eio.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata$zzz
0000000000000000 t .text
0000000000000000 r .xdata
U __imp___iob_func
U fgets
0000000000000000 T readline
U String_append
U String_construct
U String_empty
U strlen
显然,我对链接的理解没有我想象的那么好,我在谷歌上也找不到任何东西,因为我一直在得到关于基本链接的结果,就像我的第一个工作示例一样。将评论转换为答案
在详细说明问题以及确切的错误消息和库的内容之前:
您认为来自
make
的链接命令是什么?在makefile
中有编译器的路径;您确定这是从命令行执行的同一个程序吗?您还在makefile中链接一个对象文件,但将源文件编译为对象,然后在命令行上链接-错误消息是什么
乔恩·韦尔登回答说:
当我使用与makefile中的路径相同的exe进行编译时,我会得到其他错误,我会将这些错误添加到我的问题中
为了进一步澄清,我问:
如果将链接命令行中的
$(objfiles)
替换为$(srcfiles)
,是否有效?paramSeed
警告不会影响链接(但如果将-Werror
添加到编译器选项中,则会影响链接)。您的程序中是否存在32位代码与库中64位代码混合的风险,反之亦然?如果这是一个问题,您经常会收到警告,但它也会阻止链接
Jon Weldon回答说:
@乔纳坦利弗勒在道路上的差异是正确的。My path env变量在Haskell安装中首先找到gcc
,它是32位的。但是,当我使用makefile时,指定目录中的gcc
是64位的。GCC要么忽略了库,要么由于命名约定而无法解析符号
如果你以前没有见过这种问题,那么很难诊断。但是,链接器无法在正确类型的对象文件中找到任何包含符号的对象文件。关于错误类型的对象文件(或整个库)的警告本来不错,但最终它是正确的-它找不到正确的符号。请更新您的帖子:1)“j”库文件的“dir”(或“ls-l”);2)复制/粘贴准确的错误从
make
中看到的链接命令是什么?在makefile
中有编译器的路径;您确定这是从命令行执行的同一个程序吗?您还在makefile
中链接一个对象文件,但将源文件编译为对象,然后在命令行上链接-错误消息是什么?@palsm4完成,我不太确定您所说的1是什么意思。如果在链接命令行中将$(objfiles)
替换为$(srcfiles)
,是否有效?paramSeed
警告不会影响链接(但如果将-Werror
添加到编译器选项中,则会影响链接)。您的程序中是否存在32位代码与库中64位代码混合的风险,反之亦然?如果这是一个问题,你经常会收到警告,但这也会阻止链接。好吧,我觉得自己像个傻瓜@乔纳坦利弗勒在道路上的差异是正确的。我的path env变量在haskell安装中首先找到gcc,它是32位的。但是,当我使用makefile时,指定目录中的gcc是64位的。GCC要么忽略了库,要么由于命名约定而无法解析符号。
C:\MinGW\bin\gcc -std=c11 -g -Iheader -Wall -MMD -MP -c src/main.c -o src/main.o
src/main.c: In function 'main':
src/main.c:8:14: warning: variable 'paramSeed' set but not used [-Wunused-but-set-variable]
const char* paramSeed = NULL;
^
C:\MinGW\bin\gcc -o librarytest.exe src/main.o -static -L. -lj
src/main.o: In function `main':
F:\school\csci440\homework1/src/main.c:56: undefined reference to `String_wrap_d'
F:\school\csci440\homework1/src/main.c:57: undefined reference to `String_touint'
collect2.exe: error: ld returned 1 exit status
makefile:15: recipe for target 'librarytest.exe' failed
mingw32-make: *** [librarytest.exe] Error 1
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata
0000000000000000 r .rdata$zzz
0000000000000000 t .text
0000000000000000 r .xdata
U __imp___iob_func
U fprintf
U free
U malloc
U memcpy
U printf
U realloc
U sscanf
U strcpy
000000000000013f T String_append
0000000000000000 T String_construct_d
000000000000004f T String_construct_s
00000000000000ce T String_deconstruct_d
00000000000000fa T String_deconstruct_s
0000000000000286 T String_empty
00000000000002e6 T String_find_after
000000000000025c T String_print
00000000000002a6 T String_touint
0000000000000093 T String_wrap_d
U strlen
eio.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata$zzz
0000000000000000 t .text
0000000000000000 r .xdata
U __imp___iob_func
U fgets
0000000000000000 T readline
U String_append
U String_construct
U String_empty
U strlen