LNK 2019:win32에서 DLL을 작성했는데 응용 프로그램에서 DLL 인터페이스 함수를 찾을 수 없는 경우

2997 단어 개발 도구
최근 프로젝트 기술 연구가 끝나고 코드 봉인을 시작했고 제품은 최종적으로 동적 라이브러리 형식으로 발표되었다. 그래서 코드를 정리하기 시작했다. 원래 정적 라이브러리 방식으로 컴파일된 함수 라이브러리를 동적 라이브러리 컴파일로 바꾸었고 동적 라이브러리는 정상적으로 컴파일되었다.그리고 컴파일러 테스트 프로그램(동적 라이브러리 호출 함수)으로 타임즈가 틀렸습니다.
2>test_detect.obj: error LNK 2019: 해석할 수 없는 외부 기호 "declspec(dllimport) void cdecl gdface:: set global run config (bool, bool)"( imp? set global runconfig@gdface@@YAX_N0@Z), 이 기호는 함수main에서 인용됩니다

이상하게도 동적 라이브러리에서 내보낸 함수가 여러 개 있는데, 이 함수만 틀렸고, 생성된 동적 라이브러리 가져오기 파일 (.lib) 을 열었습니다.문자열로 검색하면 set 을 찾을 수 없습니다.global_run_config 함수.이것은 동적 라이브러리를 컴파일할 때 문제가 생겼다는 것을 증명한다.
그런데 왜 하필 이 함수 하나만 문제가 생겼을까?나는 이 함수와 다른 함수의 차이를 자세히 비교한 결과 기호를 정상적으로 내보낼 수 있는 함수가 같은 cpp 파일 A에 있고 이 문제 함수만 다른 cpp 파일 B에 있다는 것을 발견했다.A 파일에는 include 아래의 인터페이스 헤더 파일이 있고 B 파일에는 include 인터페이스 헤더 파일이 없습니다
detect_cl.h
#ifndef FACEDETECT_DETECT_CL_H_
#define FACEDETECT_DETECT_CL_H_
#include 
//             
#ifdef _WIN32
#ifdef DETECT_CL
#define DETECT_CL_DLL_DECL __declspec(dllexport)
#define DETECT_CL_EXTERN
#else
#define DETECT_CL_DLL_DECL __declspec(dllimport)
#define DETECT_CL_EXTERN
#endif
#else
#define DETECT_CL_DLL_DECL
#define DETECT_CL_EXTERN
#endif
namespace gdface{
DETECT_CL_DLL_DECL gf_rect_def gf_rect_unnormalization(  const gf_rect_norm &norm_obj,const gf_int2 &img_size);
DETECT_CL_DLL_DECL object_info_vector& convert_def(object_info_vector& objects, const gf_int2 &img_size);
DETECT_CL_DLL_DECL object_info_vector convert_def(const object_info_vector& objects, const gf_int2 &img_size);
DETECT_CL_DLL_DECL void set_global_run_config(bool debug_show,bool kerne_message);
}/*namespace gdface*/
#endif /* FACEDETECT_DETECT_CL_H_ */

그래서 나는 B 파일의 첫머리에 #include "detect cl.h"를 넣고 정상적으로 컴파일했다.결론은 동적 라이브러리 인터페이스 함수에 대해 컴파일하는 동안 일반 함수와 차이가 있고 연결하는 동안만 있는 것이 아니기 때문에 함수가 있는 cpp/c 파일은 반드시 #include라는 인터페이스 함수의 정의 헤더 파일이어야 한다.

좋은 웹페이지 즐겨찾기