如何将我的C代码链接到PCRE库? (目前正在抛出链接器错误。)

问题

注意:我最初在一个更大的项目中遇到了这个问题; 所以我把代码减少到你看到的测试用例。

我无法弄清楚如何编译以下测试代码。 具体来说,似乎链接器无法找到PCRE库(请参阅下面的PCRE配置方式)。 尽管显式-L/usr/local/lib -lpcre被传递给链接器(PCRE安装在/usr/local目录结构中)。

我究竟做错了什么? 🙁

控制台输出是:

 $ make rm -f ./*.o gcc -ansi -Wall -pedantic-errors -I/usr/local/include -g0 -O3 -static -static-libgcc -march=i686 -malign-double -m128bit-long-double -c main.c -o main.o gcc -ansi -Wall -pedantic-errors -L/usr/local/lib -lpcre -g0 -O3 -static -static-libgcc -march=i686 -malign-double -m128bit-long-double main.o -o pcre_test_1_i686 main.o:main.c:(.text+0x100): undefined reference to `pcre_compile2' main.o:main.c:(.text+0x12e): undefined reference to `pcre_study' main.o:main.c:(.text+0x16e): undefined reference to `pcre_exec' main.o:main.c:(.text+0x19f): undefined reference to `pcre_copy_substring' collect2: ld returned 1 exit status make: *** [all] Error 1 

相关文件


PCRE配置和编译环境

 ./configure --disable-shared --enable-static --disable-cpp --enable-rebuild-chartables --enable-utf8 --enable-unicode-properties --enable-newline-is-any --disable-stack-for-recursion --with-posix-malloc-threshold=2 --with-link-size=4 CC="gcc" CFLAGS="-g0 -O3 -static -static-libgcc -march=i686 -malign-double -m128bit-long-double" LD_RUN_PATH="/usr/local/include:/usr/local/lib" 

main.c中

 #define PCRE_STATIC #include  #include  #include  #include  #include  #define OUTPUT_SIZE 12 #define SUBSTRING_SIZE 16 int main(int argc, char *argv[]) { pcre *re; pcre_extra *extra; const char *input = "get food"; const char *pattern = "^\\s*get\\s+(\\w+)\\s*$\0"; int options = PCRE_CASELESS | PCRE_UTF8 | PCRE_UCP; int error_code = 0; int error_offset = 0; const char *compile_error; const char *study_error; int output[OUTPUT_SIZE]; char substring[SUBSTRING_SIZE]; int matched = 0; int is_error = 0; int index = 0; for(index = 0; index  1) { int status = pcre_copy_substring( input, output, matched, 1, substring, SUBSTRING_SIZE ); if(status < 0) { switch(status) { case PCRE_ERROR_NOMEMORY: fprintf(stderr, "PCRE substring extraction error: %s", "Buffer too small"); break; case PCRE_ERROR_NOSUBSTRING: fprintf(stderr, "PCRE substring extraction error: %s", "Invalid substring number"); break; } is_error = 1; } } printf("Capture group 1 is: '%s'\n", substring); if(is_error) { printf("There was an error with the pcre_copy_substring() function.\n"); } return EXIT_SUCCESS; } 

Makefile文件

 PACKAGE = pcre_test VERSION = 1 # -ansi == ANSI C # -std=iso9899:199409 == ANSI C w/ Amendment 1 # -std=c99 == ISO C99 GCC_CMD = gcc -ansi -Wall -pedantic-errors # Generic: i686 # Intel: core2, corei7, corei7-avx # AMD: k8-sse3, opteron-sse3, athlon64-sse3, amdfam10 ARCH = i686 RELEASE_FILE = $(PACKAGE)_$(VERSION)_$(ARCH) GCC_OPTIONS = -g0 -O3 -static -static-libgcc -march=$(ARCH) -malign-double -m128bit-long-double GCC_COMPILE = $(GCC_CMD) -I/usr/local/include $(GCC_OPTIONS) GCC_LINK = $(GCC_CMD) -L/usr/local/lib -lpcre $(GCC_OPTIONS) GCC_LINK_ALL = $(GCC_LINK) main.o all: clean build_main $(GCC_LINK_ALL) -o $(RELEASE_FILE) build_main: $(GCC_COMPILE) -c main.c -o main.o clean: rm -f ./*.o 

[编辑]

答案已经找到!

必须所有目标文件之后列出所有外部库标志。 因此, Makefile应该看起来像这样:

 GCC_LINK = $(GCC_CMD) -L/usr/local/lib $(GCC_OPTIONS) GCC_LINK_ALL = $(GCC_LINK) main.o -lpcre 

感谢所有回复答案的人。 🙂

链接器是否有可能找到libpcre.so的预构建版本?

尝试这个问题的建议:“在编译器命令行上指定/usr/local/lib/libpcre.a …避免包括-lpcre”。