프로그램의 일부 기능을 사용하는 라이브러리를 작성하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/25049410

문제

몇 년 전 3 C ++ 프로젝트가 사용한 C ++ 라이브러리를 개발했습니다. libs가 변경 될 때 프로그램을 다시 컴파일 / 다시 링크 할 필요가 없으므로 라이브러리를 공유 라이브러리로 컴파일했습니다. CMAKE 3.0에 컴파일 프로세스를 이식하지만 하나의 컴파일에 문제가 있습니다.

이 라이브러리는 일부 기능을 제공 할 수 없습니다. 라이브러리 내부에서 사용 되더라도 몇 가지 기능을 기본 프로그램에 정의해야합니다. 그 이유는 이러한 함수의 구현이 프로그램 내부 구조에 의존한다는 것입니다.

라이브러리는 이러한 모든 함수를 extern 로 선언하는 헤더로 컴파일되었습니다. 다음은 문제가있는 라이브러리의 헤더에서 오는 예제입니다.

extern char *  Get_Name(void *b);
.

extern extern 은 불필요한 것 같습니다.

x86_64 Linux에서는 몇 년 동안이 조직을 사용하지 않았습니다.

그러나 이제는 OSX Mavericks (Clang : Apple LLVM 버전 5.1 (Clang-503.0.40) (LLVM 3.4SVN 기준)에서 라이브러리의 편집이 실패합니다. Cmake 파일이나 최악의 경우 OSX의 덕분에 문제가 될 수 있습니다. 문제는 링크 시간 (.dynlib 파일을 만들 때)에서 기능의 정의를 찾을 수 없습니다. 특정 오류는 다음과 같습니다.

cmake VERBOSE=1
[...]
Linking CXX shared library libtiming.dylib
/Applications/CMake.app/Contents/bin/cmake -E cmake_link_script CMakeFiles/timingShared.dir/link.txt --verbose=1
/usr/bin/c++   -dynamiclib -Wl,-headerpad_max_install_names   -o libtiming.dylib -install_name @rpath/libtiming.dylib <list of .o files> /Users/me/usr/lib/libone.dylib  -Wl,-rpath,/Users/me/usr/lib
Undefined symbols for architecture x86_64:
"Function_Name(void*)", referenced from:
[...]
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
.

내 질문은 다음과 같습니다.

  1. 는 C ++ 라이브러리가 라이브러리를 사용하여 프로그램에 정의 된 기능을 사용할 수 있습니까?
  2. 그렇지 않은 경우, 일부 기호가 객체에 정의되지 않았지만 (주 프로그램에서만) 일부 기호가 정의되지 않더라도 Linux 컴파일에 대한 특별한 것은 무엇입니까?
  3. 가능하다면 CMake에 뭔가 잘못 뭔가를하고 있습니까? 링크 명령이 뭔가를 놓치고 위에 게시 한 것입니까? 내가 필요한 도서관을 얻기 위해 "연결"과 다른 것을 사용해야합니까?
  4. 고맙습니다.

도움이 되었습니까?

해결책 2

Chris Statton에게 감사드립니다.링크 시간에 정의되지 않은 기호를 무시하도록 링커에게 알려야했습니다.

OSX Mavericks, man ld 상태 :

 -undefined treatment
             Specifies how undefined symbols are to
             be treated. Options are: error, warning,
             suppress, or dynamic_lookup.  The
             default is error.
.

전달 -undefined dynamic_lookup 문제의 링크 프로세스에 문제가 해결되었습니다.

CMAKE 부분의 경우, add_library () :

다음에 다음을 추가해야했습니다.
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
.

다른 팁

1에 대한 답변 :

라이브러리를 해결 해야하는 해결되지 않은 기호가있을 수 있습니다.다른 도서관이나 프로그램에서 해결할 수 있습니다.

그러나 라이브러리는 프로그램이 포함 된 기능을 알기 위해 다시 작성해야합니다.따라서 라이브러리가 프로그램에서 특정 함수에 액세스 해야하는 경우 해당 함수의 선언으로 재구성해야합니다.

일반적으로 라이브러리가 라이브러리 외부의 함수를 호출하는 경우 해당 함수는 해결되지 않은 기호이며 헤더 파일에서 선언되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top