2016-05-15 13 views
0

Ich versuche, eine Kette von externen Bibliotheken (liblept mit libjpeg) zu einem Projekt zu verknüpfen. Zahlreiche Versuche und die Suche im Internet verursacht nur verschiedene Cmake Fehler, dieCmake: statische Verknüpfung erfordert Bibliotheken zur Laufzeit (appcrash 0xC0000135)

Die Struktur des Projektordners ziemlich verwirrend ist:

/Project 
    |leptonica 
    |--|include 
    | |--|leptonica 
    | | |--|<allheaders.h used by main.cpp is here> 
    | | |<jpeglib.h used by Leptonica is here> 
    | |lib 
    | |--|<.lib files here> 
    |CMakeLists.txt 
    |main.cpp 

Nun werden die CMakeLists. Das einzige, was ich über das Verknüpfen dieser Bibliotheken weiß, ist, dass die grundlegenden Tipps rund um Stack Overflow unterschiedliche Fehler erzeugen. Mit Ausnahme der folgenden:

Dies ruft das Projekt verknüpft, aber die Anwendung stürzt mit 0xC0000135 ab (konnte die DLL nicht finden).

cmake_minimum_required(VERSION 3.5) 
project(Project) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(SOURCE_FILES main.cpp) 

add_library(liblept168 STATIC IMPORTED) 
set_target_properties(
    liblept168 
    PROPERTIES LINKER_LANGUAGE CXX 
    IMPORTED_LOCATION %Project%/leptonica/lib/liblept168.lib) 
add_library(libjpeg8c-static-mtdll STATIC IMPORTED) 
set_target_properties(
    libjpeg8c-static-mtdll 
    PROPERTIES LINKER_LANGUAGE CXX 
    IMPORTED_LOCATION %Project%/leptonica/lib/libjpeg8c-static-mtdll.lib) 
link_directories(leptonica/lib) 
include_directories(leptonica/include) 
include_directories(leptonica/include/leptonica) 

add_executable(Project "${SOURCE_FILES}") 
target_link_libraries(Project liblept168 libjpeg8c-static-mtdll) 

Was ist los?

+1

Wenn die ausführbare Datei für eine DLL sucht dann vermute ich, Sie sind nicht statisch die Bibliothek verknüpft, sondern nur die Stub-LIB-Datei von Windows verwendet, um DLL-Funktionen zu verweisen. Überprüfen Sie dies: http://StackOverflow.com/questions/6421693/why-are-lib-files-beasts-of-such-a-duplicitous-nature. Das ist ein Problem mit LIB-Dateien, bei denen es sich entweder um Bibliotheken mit echter Implementierung oder um Stubs handeln kann, die zur dynamischen Verknüpfung mit einer DLL verwendet werden. Haben Sie versucht, die DLL zum Binärordner hinzuzufügen? – Jack

Antwort

0

Dank der Notiz über .lib s von Jack fand ich das Problem. Die Sache ist liblept168.lib ist die Verknüpfungsdatei für liblept168.dll, keine statische Bibliothek. Also sollte die DLL in den ausführbaren Ordner kopiert werden. Das resultierende CMakeLists sieht wie folgt aus:

cmake_minimum_required(VERSION 3.5) 
project(Jpeg_to_values) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(SOURCE_FILES main.cpp) 

add_library(liblept168 SHARED IMPORTED) 
set_target_properties(
    liblept168 
    PROPERTIES LINKER_LANGUAGE CXX 
    IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/leptonica/lib/liblept168.dll 
    IMPORTED_IMPLIB ${PROJECT_SOURCE_DIR}/leptonica/lib/liblept168.lib) 
add_library(libjpeg8c-static-mtdll STATIC IMPORTED) 
set_target_properties(
     libjpeg8c-static-mtdll 
     PROPERTIES LINKER_LANGUAGE CXX 
     IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/leptonica/lib/libjpeg8c-static-mtdll.lib) 
link_directories(leptonica/lib) 
include_directories(leptonica/include) 
include_directories(leptonica/include/leptonica) 

add_executable(Jpeg_to_values "${SOURCE_FILES}") 
target_link_libraries(Jpeg_to_values liblept168 libjpeg8c-static-mtdll) 

add_custom_command(
     TARGET Jpeg_to_values POST_BUILD 
     COMMAND ${CMAKE_COMMAND} -E copy_if_different 
     "${PROJECT_SOURCE_DIR}/leptonica/lib/liblept168.dll" 
     "$<TARGET_FILE_DIR:Jpeg_to_values>") 
Verwandte Themen