2017-01-26 4 views
0

cmake 스크립트 FindwxWidgets은 모든 .lib 파일 목록을 만듭니다.CMake 목록 wxWidgets Dll 및 설치시 복사하십시오.

그러나이 스크립트는 wxWidgets dll 목록을 제공하지 않습니다.

디버그 및 릴리스 대상에 대한 모든 wxWidgets Dll 파일을 목록에 저장하는 CMake 스크립트는 무엇입니까?

ps : wxWidgets 및 CMake를 기반으로하는 프로젝트를 발견했지만 모두 wxWidgets와 정적으로 연결됩니다. 진행

일 :

현재의 더러운 솔루션은 wxWidgets에 디렉토리의 모든 DLL의의를 가져과 EXE 같은 폴더에 설치하는 것입니다. 그러나 find_package 명령과 링크되어 있지 않으므로 사용 된 구성 요소에 대한 필터가 없습니다. 여기

# Copy wxWidgets Dll's # extract folder path
file(GLOB wxwidgets_dlls "${wxWidgets_LIB_DIR}/*.dll") list(APPEND WXWidgets_DLL_Slash "") foreach(WXWidgets_DLL ${wxwidgets_dlls}) # Check if dll does not contain "ud" for debug dll get_filename_component(DLL_FILENAME ${WXWidgets_DLL} NAME_WE) string(FIND ${DLL_FILENAME} "ud" debug_annot) if(${debug_annot} LESS 0) string(REPLACE "\\" "/" WXWidgets_DLL ${WXWidgets_DLL}) MESSAGE(STATUS "Install ${WXWidgets_DLL}") list(APPEND WXWidgets_DLL_Slash ${WXWidgets_DLL}) endif() endforeach(WXWidgets_DLL)
install(FILES ${WXWidgets_DLL_Slash} DESTINATION .)

+0

프로젝트가 CMake를 사용해야하는지 확신 할 수 없지만 그렇지 않다면 왜 CMake없이 wxWidgets를 컴파일하지 않습니까? 그것은 매우 쉽습니다 ... – macroland

+0

@macroland wxWidgets를 컴파일하지 않고 wxWidgets에 링크 된 프로젝트를 컴파일합니다. 그러나 동적 링크를 사용하면 최종 실행 파일에 wxWidgets Dll이 필요합니다. 그래서 나는 CMake를 사용하여이 Dll을 찾고 복사하는 방법을 찾아야합니다. –

+0

나는 당신이 실제로 원하는 것을 분명하지 않기 때문에 당신의 질문을 닫도록 투표 할 것입니다. 현재 가지고있는 것과 부족한 것을 보여주는 최소한의 예를 보여줄 수 있습니까? – usr1234567

답변

1

내가 CPack 함께 사용 what의 예이다. dumpbin/readelf을 사용하여 .exe을 분석하여 복사 할 라이브러리를 찾습니다.

내 스크립트는 또한 결과 DLL을 제거하려고합니다 (원하는 경우 해당 부분을 제거 할 수 있습니다).install(TARGETS ...) 명령 다음에이 을 삽입하십시오. 당신이 조정해야 할 수도 있습니다

것 (주의, 그들은 시간을 설치하기 전에 확장됩니다) :

  • RUNTIME_DIR - 대상의 이름 - 당신의 .exe.dll 파일
  • EXECUTABLE_NAME를 설치 bin 같은 하위 디렉토리 .exe
  • 세 번째 매개 변수 fixup_bundle - \"\"으로 변경해야하지만 \"${wxWidgets_LIB_DIR}\" (디렉토리는 install(CODE ...)이 그대로 cmake_install.cmake 파일에 문자열의 내부에 명령을 추가, 그래서 발전기 표현은 확장되지 않습니다)
install(CODE " 
    include(BundleUtilities) 
    fixup_bundle(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${RUNTIME_DIR}/${EXECUTABLE_NAME}${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"\") 
    file(GLOB dynamic_libs \"\${CMAKE_INSTALL_PREFIX}/${RUNTIME_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}*\") 
    message(STATUS \"GLOB: \${dynamic_libs}\") 
    foreach(dll IN LISTS dynamic_libs) 
     if(\"${CMAKE_STRIP}\") 
      execute_process(COMMAND ${CMAKE_STRIP} \"-s\" \${dll}) 
     endif() 
    endforeach(dll) 
") 

업데이트를 DLL을 복사한다. 유용한 변수의 수 또한 매우 제한되어 있습니다. 예를 들어 ${CMAKE_INSTALL_PREFIX}cmake_install.cmake 안에 확장되었지만 거기에 가기 전에 ${CMAKE_SHARED_LIBRARY_SUFFIX}을 확장해야합니다.

${PROJECT_BINARY_DIR}/\${CMAKE_INSTALL_PREFIX}을 사용하여 .exe에 대한 전체 경로를 수동으로 만들 수 있습니다.

+0

감사. 나는 내일 그것을 시도하고 피드백을 줄 것이다. –

+0

최종 exe 이름으로 평가되어야하는 $ 를 사용해 보았지만이 변수는 확장되지 않습니다. –

+0

@ nicolas-f 죄송합니다.이 경우 발전기 표현식이 작동하지 않습니다. 'install (CODE ..)'는 단순히 문자열에있는 명령을'cmake_install.cmake' 파일에 추가합니다. 이 파일 생성기에서 표현식은 확장되지 않고 많은 변수가 없습니다 (우리는'CMAKE_INSTALL_PREFIX'를 사용할 수 있습니다 만,'CMAKE_SHARED_LIBRARY_SUFFIX'는 미리 수동으로 확장해야합니다). – Nazar554