Debugging Calls to Shared Libraries
- 업데이트 날짜:2026-06-12
- 5분 (읽기 시간)
Debug LabVIEW shared library calls by troubleshooting the functionality of your library and your Call Library Function Node configuration.
라이브러리 함수 호출 노드 문제 해결
LabVIEW에서 공유 라이브러리를 호출할 때 오류가 발생하면, 다음 문제를 확인하여 라이브러리 함수 호출 노드가 올바르게 구성되었는지 확인하십시오.
- 라이브러리 함수 호출 노드가 공유 라이브러리의 올바른 이름 또는 경로를 가지고 있는지 확인하십시오. 또한 사용 사례에 맞게 디스크의 위치를 적절히 지정하십시오. 일부 사용 사례에서는 경로로 공유 라이브러리를 지정해야 하며, 다른 사용 사례에서는 이름으로 공유 라이브러리를 지정해야 합니다.
- LabVIEW로 만든 공유 라이브러리의 경우, 컴퓨터에 공유 라이브러리를 생성하는 데 사용된 각 LabVIEW 버전과 호환되는 LabVIEW 런타임 엔진 버전이 있는지 확인하십시오.
- 에러 메시지 라이브러리에서 함수를 찾을 수 없습니다를 받는 경우, 라이브러리 함수 호출 노드가 호출하는 함수 이름의 맞춤법, 구문, 대소문자가 올바른지 확인하십시오.
- 컴파일러가 함수 이름을 장식하지 않았는지 확인하십시오.
- 보조 공유 라이브러리를 찾을 수 없다는 에러 메시지를 받고 라이브러리 함수 호출 노드에서 주요 공유 라이브러리의 경로를 올바르게 지정한 경우, 주요 공유 라이브러리는 하나 이상의 다른 공유 라이브러리에서 추가적인 함수가 필요합니다. 다른 공유 라이브러리를 찾아 해당 공유 라이브러리와 동일한 디렉토리 또는 검색 경로에 있는 디렉토리에 배치하십시오. 더 자세한 정보는 ni.com의 KnowledgeBase를 참조하십시오.
- VI가 충돌하는 경우, 라이브러리 함수 호출 노드의 함수에 대한 인수의 반환 타입과 데이터 타입이 함수가 사용하는 데이터 타입과 정확히 일치하는지 확인하십시오. 또한 라이브러리 함수 호출 노드가 라이브러리 함수 호출 대화 상자의 에러 확인 레벨 탭을 사용하여 적절한 호출 규약 (C 또는 __stdcall)을 사용하는지 확인하십시오.
- 모든 파라미터가 값 또는 포인터 등 올바른 방법으로 전달되도록 정의되어 있는지 확인하십시오. 또한 라이브러리 함수 호출 노드가 함수에 인수를 올바른 순서로 전달하는지 확인하십시오.
- 배열 또는 데이터 문자열의 경우, 함수가 버퍼에 저장하는 결과를 수용할 수 있도록 항상 충분한 크기의 버퍼 또는 배열을 전달하십시오. 그러나 LabVIEW 핸들로 전달하는 경우, Visual C++ 또는 Xcode 컴파일러에서 LabVIEW Manager 함수를 사용하여 크기를 조정하십시오.
- 메시지를 받는 경우, 그 원인은 거의 항상 배열에 할당된 메모리 끝을 지나서 쓰는 것과 같이 공유 라이브러리 코드에서 발생한 오류입니다. 이러한 유형의 충돌은 공유 라이브러리 호출이 실제로 블록다이어그램에서 실행될 때 발생하지 않을 수도 있습니다.
- ActiveX 객체를 포함하는 공유 라이브러리를 호출하려면 라이브러리 함수 호출 노드 대신 [오토메이션 열기] 함수와 프로퍼티 노드, 인보크 노드를 사용하십시오.
- LabVIEW로 만든 공유 라이브러리의 모든 호출은 모든 스레드에서 실행을 지정해야 합니다. LabVIEW 내장 공유 라이브러리를 사용하는 [라이브러리 함수 호출 노드]를 설정하고 모든 스레드에서 실행을 지정하면 LabVIEW가 멈추어 다시 시작해야 하는 경우도 있습니다.
- 파스칼 문자열은 255자를 초과할 수 없습니다.
- 라이브러리 함수 호출 노드가 LabVIEW 배열 핸들 또는 LabVIEW 문자열 핸들을 전달할 때에만 배열과 문자열의 크기를 조정할 수 있습니다. labviewv.lib를 통해 Visual C++ 프로젝트로 내보낸 함수를 사용하여 배열과 문자열을 크기 조정하고, liblvexports.a를 Xcode 프로젝트로 내보낸 함수를 사용하여 크기 조정하십시오.
- C 문자열은 NULL로 종료됩니다. DLL 함수가 GPIB 또는 시리얼 포트를 통해 바이너리 문자열 형식으로 숫자 데이터를 반환하는 경우, 데이터 문자열의 일부로 NULL 값을 반환할 수 있습니다.
공유 라이브러리 문제 해결
LabVIEW에서 공유 라이브러리를 호출할 때 오류가 발생하면, 다음 팁을 참조하여 호출하는 공유 라이브러리에 문제가 없는지 확인하십시오.
- 다른 어플리케이션이 호출하는 공유 라이브러리 함수가 모듈 정의 파일의 EXPORTS 섹션에 나타나거나, 함수 선언에 _declspec (dllexport) 키워드를 포함해야 합니다. 헤더 파일에서 C++ 컴파일러 함수 반출 지정자(C++ compiler function export directive)인 extern "C"{}를 사용하여, 이름 변환(name mangling)이라는 프로세스를 실행함으로써 C++ 컴파일러가 반출된 함수 이름을 처리할 때 플랫폼과 관계없이 실행되도록 합니다. 다음에 보이는 예제 코드를 참조하십시오:
extern "C" {
/* 함수 프로토타입을 여기에 작성 */
}
- 함수를 헤더 파일과 소스 코드에 _declspec (dllexport) 키워드로 선언하거나, 모듈 정의 파일의 EXPORTS 섹션에 정의해야 합니다.
- _declspec (dllexport) 키워드를 사용하고 __stdcall 호출 규약을 사용하는 경우, 공유 라이브러리 함수 이름을 모듈 정의 .def 파일의 EXPORTS 섹션에 선언해야 합니다. .def 파일이 없는 경우, __stdcall은 예측할 수 없는 패턴으로 함수 이름을 잘라내므로, 공유 라이브러리를 호출하는 어플리케이션에서 실제 함수 이름을 사용할 수 없습니다.
- 함수가 올바르게 내보내지지 않은 경우, 공유 라이브러리를 다시 컴파일해야 합니다. 어플리케이션(예: VI)이 공유 라이브러리를 메모리에 로드하고 있을 때에는 공유 라이브러리를 다시 컴파일하지 마십시오. 공유 라이브러리를 다시 컴파일하기 전에, 공유 라이브러리를 사용하는 모든 어플리케이션이 메모리에서 언로드되었는지 확인하십시오. 이렇게 하면 다시 컴파일할 때 공유 라이브러리가 메모리에 로드되지 않습니다. 이 점을 잊고 컴파일러가 경고하지 않으면 공유 라이브러리가 올바르게 다시 빌드되지 않을 수 있습니다. 그러나 대부분의 컴파일러는 어플리케이션이 공유 라이브러리를 사용할 때 경고합니다.
- 컴파일러와 함께 제공되는 소스 레벨 디버거를 사용하여 공유 라이브러리를 디버깅하십시오. 컴파일러의 디버거를 사용하여 브레이크포인트를 설정하고, 코드를 단계별로 실행하고, 변수 값을 확인할 수 있습니다. 기존 도구를 사용한 디버깅은 매우 유용할 수 있습니다. 디버깅에 대한 자세한 정보는 사용 중인 컴파일러의 적절한 매뉴얼을 참조하십시오.
- 다른 C 프로그램에서 공유 라이브러리를 호출하는 것도 공유 라이브러리를 디버깅하는 또 다른 방법입니다. 다른 C 프로그램에서 공유 라이브러리를 호출하면 LabVIEW와 독립적으로 공유 라이브러리를 테스트할 수 있으므로 문제를 더 빨리 확인할 수 있습니다.
- 2D 배열을 전달하는 LabVIEW 공유 라이브러리를 호출하는 경우, 먼저 핸들러 변수를 선언하고 다음 C 코드에서 보이는 것처럼 NULL로 초기화해야 합니다.
주요
{
/* LabVIEW 배열용 데이터 핸들러 변수 */
TD1Hd1myArray = NULL;
...
/* LabVIEW 공유 라이브러리 함수 호출 */
DLLFunctionalCall(&myArray);
...
}
핸들러 변수를 NULL로 초기화하지 않으면, 공유 라이브러리를 호출할 때 코드에서 일반 보호 결함이 발생합니다. - LabVIEW 공유 라이브러리 함수가 중단 없이 실행되도록 하기 위해, LabVIEW는 공유 라이브러리 함수 호출이 끝날 때까지 또는 공유 라이브러리에서 모달 윈도우를 로드할 때까지 운영 체제 메시지 처리를 지연시킵니다. 공유 라이브러리 함수가 실행되는 동안 동일한 공유 라이브러리 파일을 호출하는 것을 방지하기 위해, 키보드와 같은 운영 체제 메시지 처리를 지연하는 것이 유용합니다. 예를 들어 사용자가 버튼을 누른데 대한 응답으로 공유 라이브러리 함수가 호출된다면, 사용자는 공유 라이브러리 함수가 완료될 때까지 버튼을 누를 수 없게 됩니다. LabVIEW가 운영 체제 메시지 처리를 지연하면, 동일한 LabVIEW 공유 라이브러리에 대한 모든 함수 호출이 큐에 저장됩니다. 원래 공유 라이브러리 함수 호출이 완료된 후 해당 큐가 실행됩니다. 모달 윈도우는 윈도우를 닫거나 다른 모달 윈도우를 열 때까지 활성화 상태로 있거나 다른 LabVIEW 윈도우보다 상위에 있는 윈도우 타입입니다. 공유 라이브러리에서 모달 윈도우를 로드하는 경우, LabVIEW는 처리 지연을 무시하고 메시지를 처리하여 모달 윈도우가 활성화되도록 합니다. 모달 윈도우가 열려 있는 동안에는 다른 윈도우와 상호작용을 할 수 없습니다. 대부분의 LabVIEW 대화 상자는 모달 윈도우입니다. 다른 프로세스가 실행 중일 때에는 LabVIEW 콜백 VI나 공유 라이브러리에서 모달이 아닌 윈도우를 열 수 없습니다. 콜백 VI 또는 공유 라이브러리가 모달이 아닌 윈도우를 호출하려면, 콜백 VI 토픽에 설명된 단계를 완료하여 프로그램적으로 호출해야 합니다.
- 빌드하는 공유 라이브러리에서 운영 체제 메시지 지연 여부를 선택할 수 있습니다. 공유 라이브러리를 빌드하기 전에 공유 라이브러리 프로퍼티 대화 상자의 고급 페이지로 이동하여, 공유 라이브러리 함수가 실행되는 동안 운영 체제 메시지를 처리하려면 공유 라이브러리에서 OS 메시지 지연 확인란의 체크를 해제하십시오.
- 다음과 같은 경우 디버그 가능한 어플리케이션 또는 런타임 라이브러리가 발견되지 않았습니다 에러가 발생할 수 있습니다.
- 디버깅 가능한 공유 라이브러리가 로드되지 않았거나 어플리케이션에서 언로드되었습니다.
- 어플리케이션 빌더에 의해 생성된 공유 라이브러리의 구성 ini 파일이 공유 라이브러리와 함께 배포되지 않았습니다.
관련 콘텐츠
- LabVIEW에서 공유 라이브러리 호출하기
LabVIEW에서 라이브러리 함수 호출 노드를 사용하여 표준 공유 라이브러리를 호출합니다. ActiveX 객체를 포함하는 공유 라이브러리의 경우, [오토메이션 열기] 함수를 프로퍼티 노드 및 인보크 노드와 함께 사용하십시오. 설정 및 디버깅 가이드를 포함한 일반적인 워크플로를 검토합니다.
- Configuring the Call Library Function Node
- Call Library Function Node - LabVIEW Programming Reference Manual
- Call Library Function Dialog Box - LabVIEW Programming Reference Manual
- LabVIEW Manager Functions - LabVIEW Programming Reference Manual
- Specifying the Location of Shared Libraries on Disk
- LabVIEW 런타임 엔진 사용하기
- 함수 원형 만들기
- Automation Open Function - LabVIEW Programming Reference Manual
- ActiveX 컨테이너 개요
ActiveX 컨테이너를 사용하여 LabVIEW VI 프런트패널에 ActiveX 컨트롤 또는 문서를 포함시킵니다.
- 콜백 VI
콜백 VI는 사용자가 지정한 ActiveX 또는 .NET 이벤트를 처리하기 위해 작성한 코드를 포함합니다.
- Shared Library Properties Dialog Box - LabVIEW Programming Reference Manual