컴파일 타임 -gcc, g ++, cmake general에서 동적 라이브러리에 대한 몇 가지 문제를 해결 한 경험

사실 cmake는 기본적으로 makefile을 생성합니다. 전에 muduo 라이브러리를 컴파일 한 적이 있는데 문제가 발생했습니다. git 문제를 참조하십시오.

https://github.com/chenshuo/muduo/issues/470

당시 문제를 설명하면서 당시 공식 웹 사이트에서 부스트 라이브러리를 다운로드 한 상태였습니다.

./b2

./b2 install

하지만 여전히 나타났다

/tmp/ccLjGYKC.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
main.cc:(.text+0x30):对‘boost::unit_test::unit_test_log_t::instance()’未定义的引用
collect2: error: ld returned 1 exit status

사실이 시점에서 우리는이 문제를 쉽고 쉽게 해결하기 위해 몇 가지 방법을 사용할 수 있습니다. 일반적으로 연결 라이브러리 파일이 실패하거나 라이브러리를 찾을 수 없습니다.이 작업을 할 수 있다고 생각합니다. 이렇게하면 쉽게 해결할 수 있습니다. 오류를 해결하십시오.

1. --verbose를 잘 사용하기위한 요점

cc gcc g ++에있을 때 링커의 검색 경로를 볼 수 있습니다. 다음 방법을 사용할 수 있습니다.

gcc -print-search-dirs
gcc Wl,--verbose
ld -lpthread --verbose

이러한 방법을 사용하면 컴파일 중에 문제를 쉽게 해결하는 데 도움이됩니다. 링커의 검색 경로를 인쇄 할 수 있습니다. 이름이 같은 두 개가 있기 때문에 컴파일 실패의 원인을 찾았습니다. .so library, the 이전 문제는 다른 라이브러리를 찾았 기 때문인데이 방법은 정말 사용하기 쉽고 라이브러리의 검색 경로를 인쇄 할 수 있습니다.

컴파일 중에 링크하기 위해 gcc에서 사용하는 링커가 / usr / bin / ld이기 때문에 컴파일 중에 정확한 링크를위한 라이브러리를 찾을 수 있는지 가장 간단한 방법으로 어떻게 확인할 수 있습니까?

hanglei@zhanglei-virtual-machine:~$ gcc -lpthread
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status


또는

ld -lpthread

2. ldconfig를 사용하면 컴파일 중에 누락 된 라이브러리 문제를 해결할 수 있습니까?

못해 안타깝게 생각 해요 왜냐면 여러 번 시도했기 때문에 불가능하다고 생각합니다. gcc --verbose의 결과가 안된다고 하니까요.

나의 실험적 현상을 설명하십시오.

vim /etc/ld.so.conf.d/xxx.conf

내 사용자 지정 검색 경로도 추가했습니다.

/home/zhanglei/ourc/xxx/bin.lnx/x64

sudo ldconfig를 사용하고 라이브러리가 실제로로드되었음을 확인했습니다 (물론 이전에 시스템 수준 디렉토리에 라이브러리를 넣지 않았지만 직접 지정한 디렉토리에 있음). ldconfig -p를 사용했으며 효과가있었습니다.

zhanglei@zhanglei-virtual-machine:~$ sudo ldconfig -p|grep iter
	libsciter-gtk.so (libc6,x86-64) => /home/zhanglei/ourc/xxx/bin.lnx/x64/libxxxx.so

zhanglei@zhanglei-virtual-machine:~$ 

하지만 경로 검색은 컴파일 할 때 정말 불만족 스럽습니다.

==================================================
/usr/bin/ld:模式 elf_x86_64
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o 成功
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o 成功
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o 成功
/usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libpthread.so 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libpthread.a 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libpthread.so 成功
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libpthread.so
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.so 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a 成功
/usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so 成功
打开脚本文件 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so
/usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so
打开脚本文件 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so
试图打开 libgcc_s.so.1 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so.1 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libgcc_s.so.1 成功
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libgcc_s.so.1
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.so 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a 成功
/usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libc.so 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libc.a 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so 成功
打开脚本文件 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so
打开脚本文件 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so
试图打开 /lib/x86_64-linux-gnu/libc.so.6 成功
/lib/x86_64-linux-gnu/libc.so.6
试图打开 /usr/lib/x86_64-linux-gnu/libc_nonshared.a 成功
/usr/lib/x86_64-linux-gnu/libc_nonshared.a
(/usr/lib/x86_64-linux-gnu/libc_nonshared.a)elf-init.oS
试图打开 /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 成功
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/libc_nonshared.a
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.so 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a 成功
/usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so 成功
打开脚本文件 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so
/usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so
打开脚本文件 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so
试图打开 libgcc_s.so.1 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc_s.so.1 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libgcc_s.so.1 成功
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libgcc_s.so.1
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.so 失败
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a 成功
/usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o 成功
/usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o
试图打开 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o 成功
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o
ld-linux-x86-64.so.2 needed by /lib/x86_64-linux-gnu/libc.so.6
found ld-linux-x86-64.so.2 at /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
/usr/bin/ld: 找到链结错误,删除可运行文件 a.out
collect2: error: ld returned 1 exit status
zhanglei@zhanglei-virtual-machine:~$ 

컴파일하는 동안 경로를 전혀 찾지 못함을 발견했습니다. 물론 gcc -L 중에 라이브러리 경로를 정의 할 수 있으며이 경로가 먼저 검색됩니다.

man ldconfig에 대한 설명을 살펴보면 중요한 설명이 있습니다.

NAME
       ldconfig - configure dynamic linker run-time bindings

즉, ldconfig는 런타임 라이브러리 인 구문 분석 된 동적 런타임 라이브러리의 링크입니다. 참조 주소 :

https://www.cnblogs.com/qinfengxiaoyue/archive/2012/05/27/2519703.html

linux:
dlopen

windows:
windows下调用动态库的方法:

1 隐式加载:即在程序中包含lib文件和.h文件,隐式链接有时称为静态加载或加载时动态链接。例如:

#include "somedll.h"

#pragma comment( lib, "somedll.lib")

   然后就可以直接调用此dll中的函数,注意运行时仍然需要somedll.dll。

 

2 显示加载:使用loadlibrary,GetProcAddress,FreeLibrary,不需要.h文件和.lib文件,但是要知道函数的原型。显式链接有时称为动态加载或运行时动态链接。

하지만 우리가 사용한다면

ln -s xxxx /usr/lib/libxxx.so

그 후에 위의 문제를 쉽게 해결할 수 있습니다.

추천

출처blog.csdn.net/qq_32783703/article/details/106677854