我试图在 windows 中将 libxml2 与我的简单目标 c 链接,我有 lib 和头文件。
我的 GNUmakefile 看起来像这样:
include $(GNUSTEP_MAKEFILES)/common.make
TOOL_NAME = sample_app
sample_app_CFLAGS = -Ic:/GNUstep/include/libxml2 -lxml2
sample_app_LDFLAGS =-Lc:/GNUstep/lib -lxml2
ADDITIONAL_FLAGS += -Ic:/GNUstep/include/libxml2 -lxml2
ADDITIONAL_LDFLAGS+=-Lc:/GNUstep/lib -lxml2
sample_app_HEADERS = HttpManager.h UT.h HtmlParser.h
sample_app_OBJC_FILES = main.m HttpManager.m UT.m HtmlParser.m
sample_app_RESOURCE_FILES =
include $(GNUSTEP_MAKEFILES)/tool.make
我在 HtmlParser.m/h 中调用 HtmlParser 的实施文件如下所示:
#import <Foundation/Foundation.h>
#import <libxml/tree.h>
#import <libxml/parser.h>
#import <libxml/HTMLparser.h>
#import <libxml/xpath.h>
#import <libxml/xpathInternals.h>
@interface HtmlParser :NSObject
{
NSString* encoding;
}
-(void)ExtractInnerSiteLinks:(NSString*) PageHtml:(NSString*) url;
@end
#import "HtmlParser.h"
#import "UT.h"
@implementation HtmlParser
-(id) init
{
self = [super init];
if(self) {
encoding = @"UTF-8";
}
return self;
}
-(void) ExtractInnerSiteLinks:(NSString*) PageHtml:(NSString*) url
{
NSData* documentData = [PageHtml dataUsingEncoding:NSUTF8StringEncoding];
NSData* urlData = [url dataUsingEncoding:NSUTF8StringEncoding];
const char *cEncoding =[encoding UTF8String];
xmlDocPtr doc;
/*
htmlReadMemory (const char *buffer,
int size,
const char *URL,
const char *encoding,
int options);
*/
doc = htmlReadMemory([documentData bytes],
[documentData length],
/*[urlData bytes]*/NULL,
/*cEncoding*/NULL,
HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
}
@end
当我运行时:让 CC=clang
我得到:
$ make CC=clang
This is gnustep-make 2.6.2. Type 'make print-gnustep-make-help' for help.
Making all for tool sample_app...
Compiling file main.m ...
clang: warning: -lxml2: 'linker' input unused when '-c' is present
Compiling file HttpManager.m ...
clang: warning: -lxml2: 'linker' input unused when '-c' is present
Compiling file UT.m ...
clang: warning: -lxml2: 'linker' input unused when '-c' is present
Compiling file HtmlParser.m ...
clang: warning: -lxml2: 'linker' input unused when '-c' is present
HtmlParser.m:25:10: warning: unused variable 'urlData' [-Wunused-variable]
NSData* urlData = [url dataUsingEncoding:NSUTF8StringEncoding];
^
HtmlParser.m:26:14: warning: unused variable 'cEncoding' [-Wunused-variable]
const char *cEncoding =[encoding UTF8String];
^
2 warnings generated.
Linking tool sample_appscrapper ...
./obj/sample_appscrapper.obj/HtmlParser.m.o: In function `-[HtmlParser ExtractInnerSiteLinks::]':
d:/dev/objc/sample_appscrapper/HtmlParser.m:37: undefined reference to `htmlReadMemory'
collect2: ld returned 1 exit status
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)
make[3]: *** [obj/sample_appscrapper.exe] Error 1
make[2]: *** [internal-tool-all_] Error 2
make[1]: *** [sample_appscrapper.all.tool.variables] Error 2
make: *** [internal-all] Error 2
使 -n :
$ make -n CC=clang
This is gnustep-make 2.6.2. Type 'make print-gnustep-make-help' for help.
(make -f GNUmakefile --no-print-directory --no-keep-going \
internal-master-tool-all \
GNUSTEP_BUILD_DIR="." \
_GNUSTEP_MAKE_PARALLEL=yes)
( \
instance=sample_app; \
operation=all; \
type=tool; \
abs_build_dir="."; \
if [ "" != "" ]; then \
echo "Making $operation in subprojects of $type $instance..."; \
for f in __done; do \
if [ $f != __done ]; then \
if [ "${abs_build_dir}" = "." ]; then \
gsbuild="."; \
else \
gsbuild="${abs_build_dir}/$f"; \
fi; \
if [ "" = "" ]; then \
if [ "$type" = "framework" ]; then \
if [ "no" = "yes" ]; then \
framework_version=""; \
if [ "$framework_version" = "" ]; then \
framework_version=""; \
if [ "$framework_version" = "" ]; then \
framework_version=""; \
if [ "$framework_version" = "" ]; then \
framework_version="0"; \
fi; \
fi; \
fi; \
owning_project_header_dir="../${instance}.framework/Versions/${framework_version}/Headers"; \
else \
owning_project_header_dir="../${instance}.framework/Headers"; \
fi; \
else owning_project_header_dir=""; \
fi; \
else \
owning_project_header_dir="../"; \
fi; \
if make -C $f -f GNUmakefile --no-print-directory --no-keep-going $operation \
OWNING_PROJECT_HEADER_DIR_NAME="${owning_project_header_dir}" \
DERIVED_SOURCES="../derived_src" \
GNUSTEP_BUILD_DIR="$gsbuild" \
_GNUSTEP_MAKE_PARALLEL=no \
; then \
:; \
else exit $?; \
fi; \
fi; \
done; \
fi; \
echo "Making $operation for $type $instance..."; \
make -f GNUmakefile --no-print-directory --no-keep-going \
internal-${type}-$operation \
GNUSTEP_TYPE=$type \
GNUSTEP_INSTANCE=$instance \
GNUSTEP_OPERATION=$operation \
GNUSTEP_BUILD_DIR="${abs_build_dir}" \
_GNUSTEP_MAKE_PARALLEL=no)
Making all for tool sample_app...
(make -f GNUmakefile --no-print-directory --no-keep-going \
internal-tool-compile \
GNUSTEP_TYPE=tool \
GNUSTEP_INSTANCE=sample_app \
GNUSTEP_OPERATION=compile \
GNUSTEP_BUILD_DIR="." \
_GNUSTEP_MAKE_PARALLEL=yes)
(echo " Linking tool sample_app ...";clang -Wl,--enable-auto-import -Lc:/GNUstep/lib -lxml2 -Lc:/GNUstep/lib -lxml2 -shared-libgcc -fexceptions -fgn
u-runtime -o obj/sample_app.exe \
./obj/sample_app.obj/main.m.o ./obj/sample_app.obj/HttpManager.m.o ./obj/sample_app.obj/UT.m.o ./obj/sample_app.obj/Html
Parser.m.o \
-L/home/meiry/GNUstep/Library/Libraries -L/GNUstep/Local/Library/Libraries -L/GNUstep/System/Library/Libraries -lgnustep-base -lobjc
-lws2_32 -ladvapi32 -lcomctl32 -luser32 -lcomdlg32 -lmpr -lnetapi32 -lm -I. )