C 从我的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

我建立了自己的图书馆,名为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时,它的链接很好!然而,当我从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