问题
注意:我最初在一个更大的项目中遇到了这个问题; 所以我把代码减少到你看到的测试用例。
我无法弄清楚如何编译以下测试代码。 具体来说,似乎链接器无法找到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*$ "; 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”。
以上就是c/c++开发分享如何将我的C代码链接到PCRE库? (目前正在抛出链接器错误。)相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560439.html