WAF - ntldd - Невозможно связать статическую системную библиотеку
Те, кто знаком с Unix, будут знать ldd
программа. В нем перечислены зависимости общей библиотеки данного исполняемого файла. Существует клон Windows под названием ntldd.
ntldd
имеет очень простой скрипт сборки:
gcc -fno-common -g -O3 -Wall -D_WIN32_WINNT=0x501 -c libntldd.c -o libntldd.o
ar rs libntldd.a libntldd.o
gcc -fno-common -g -O3 -Wall -L. ntldd.c -lntldd -limagehlp -o ntldd.exe
Скрипт сборки работает.
Какая идеальная маленькая программа для тестирования WAF, подумал я.
Это wscript, я думал, будет работать:
#! /usr/bin/env python
from waflib import Logs
APPNAME = "ntldd"
top = "."
out = "build"
def options(ctx):
ctx.load("compiler_c")
def configure(ctx):
ctx.load("compiler_c")
ctx.env.append_value("DEFINES", "_WIN32_WINNT=0x501")
if ctx.env.CC_NAME == "gcc":
ctx.env.CFLAGS = ["-g", "-fno-common", "-O3"]
ctx.check_cc(stlib = "imagehlp", linkflags = "-static")
def build(ctx):
ctx.logger = Logs.make_logger("build/build.log", "build")
ctx.env.BINDIR = "binaries"
ctx.env.LIBDIR = ctx.env.BINDIR
# a C library
ctx\
(
features = ["c", "cstlib"],
source = "libntldd.c",
target = "_ntldd",
)
# a C application
ctx\
(
features = ["c", "cprogram"],
source = "ntldd.c",
target = "ntldd",
use = ["_ntldd", "imagehlp"],
)
Но нет!
WAF считает, что я никогда не говорил ей связывать статическую библиотеку, imagehlp
, для исполняемого файла.
Из build.log:
['D:\\mingw-builds\\x64-4.8.1-posix-seh-rev5\\mingw64\\bin\\gcc.exe', '-Wl,--enable-auto-import', 'ntldd.c.2.o', '-o', 'C:\\Users\\Administrator\\Documents\\Projects\\ntldd\\build\\ntldd.exe', '-Wl,-Bstatic', '-L.', '-l_ntldd', '-Wl,-Bdynamic']
err: .\lib_ntldd.a(libntldd.c.1.o): In function `BuildDepTree':
C:\Users\Administrator\Documents\Projects\ntldd\build/../libntldd.c:235: undefined reference to `__imp_MapAndLoad'
C:\Users\Administrator\Documents\Projects\ntldd\build/../libntldd.c:441: undefined reference to `__imp_UnMapAndLoad'
collect2.exe: error: ld returned 1 exit status
Обратите внимание, что он жалуется, что не может найти MapAndLoad
а также UnMapAndLoad
; обе функции находятся в imagehlp
,
В чем дело?
1 ответ
Вы должны использовать stlib
ключ словаря для вывода списка существующих системных статических библиотек, которые вы хотите связать (похоже use
только для ссылки на другие предметы, которые вы произвели в том же Waf
строить).
# a C application
ctx\
(
features = ["c", "cprogram"],
source = "ntldd.c",
target = "ntldd",
use = ["_ntldd"],
stlib = ["imagehlp"],
)
Я нашел это в разделе 10.3 Книги Ваф. Документы API не помогли.