Dies ist ein bisschen eine komplizierte Frage zu erklären, und es beinhaltet technisch eine Menge Code, also werde ich mein Bestes tun, um es zu erklären. Wenn es sich herausstellt, dass ich Code schreiben muss, poste ich, wonach die Leute fragen, wenn sie danach fragen, um zu vermeiden, dass sie sich zu sehr auffüllen.Warum lädt mein C++ - Programm meine FORTRAN-Bibliothek nicht richtig?
Ich bin mir auch ziemlich sicher, ich weiß, was das allgemeine Problem ist, ich bin nur nicht sicher, wie es zu beheben oder herauszufinden, wie es zu beheben ist. Das meiste beschäftigt sich mit Dingen, über die ich sehr wenig weiß, und ich bin nur dort angekommen, wo ich bin, dank anderer SO-Fragen und zahlloser Google-Suchen und dergleichen, und viel Versuch und Irrtum, alles zusammen zu stopfen.
ich beginnen würde mit der Feststellung, dass ich glaube, das Problem ist, dass ein Teil von dem, was ich tue 32-Bit kompiliert wird, und ein Teil davon 64-Bit-. Hoffentlich ist das genau, und es wird Ihnen helfen, dies mit Ihrem Fokus an den richtigen Stellen zu lesen.
Grundsätzlich habe ich eine C++ - Code-Basis, die unter Windows mit CMake und Visual Studio 12 2013 erstellt und kompiliert wird, und eine FORTRAN-Codebasis, die unter Linux mit gfortran erstellt und kompiliert wird. Das Endziel besteht darin, das FORTRAN in eine Art Bibliothek zu verwandeln, die vom C++ - Code benutzt werden kann, und alles über CMake gut funktionieren zu lassen, so dass aktuelle Entwickler des C++ - Codes nichts extra oder ärger machen müssen um es zu benutzen.
Bisher habe ich eine kleine Beispielcode-Basis, mit der ich experimentiere, und sobald ich damit fertig bin, benutze ich dieselben Konzepte, um den eigentlichen Code zu erstellen.
Der Punkt, den ich bis zu bin, ist, dass es alles funktioniert gut, aber wenn ich das daraus resultierende Programm tatsächlich laufen, bekomme ich folgende Fehlermeldung:
The application was unable to start correctly (0xc000007b). Click OK to close the application.
Irgendwelche Ideen über das, was nicht in Ordnung ist (Google-Ergebnisse scheinen zu implizieren, dass die ausführbare Datei und die Bibliothek 32- und 64-Bit bzw. umgekehrt sind), und wie man es beheben kann?
Beachten Sie, dass dies alles unter Windows erstellt wird, es ist nur so, dass das FORTRAN mit gfortran im Makefile erstellt wird, das von CMake aufgerufen wird. Ich weiß eigentlich nicht genau, wie CMake make
ruft. Ich habe MSYS2 installiert, und ich habe es damit arbeiten, bevor ich zu diesem Stadium komme, aber ich weiß nicht genau, wie CMake diesen Anruf macht. Wenn Sie wissen, wie ich das herausfinden könnte, lassen Sie es mich wissen!
Hier werde ich die schrecklich geschriebene CMakeLists.txt und Makefile posten, die ich verwende, um alles zu kompilieren. Wenn Sie andere Details sehen möchten, lassen Sie es mich wissen! Da es so viele bewegliche Teile gibt, bin ich mir nicht sicher, welche Dinge in Bezug auf Softwareversionen wirklich relevant sind. Bitte lassen Sie mich wissen, wenn Sie etwas wissen möchten.
Noch einmal, ich entschuldige mich für all meine Noobishness-- dieses Zeug ist nicht meine Stärke.
Makefile:(My Editor geändert Tabs zu Leerzeichen)
FC=gfortran -g
CC=g++ -g
DLL_SRC_DIR=.
BUILD_DIR=build
all:
$(FC) -c $(DLL_SRC_DIR)/fdll.f90 -o $(BUILD_DIR)/fdll.o
$(CC) -c -DBUILDING_C_DLL $(DLL_SRC_DIR)/cdll.cpp -o $(BUILD_DIR)/cdll.o
$(CC) -shared -o $(BUILD_DIR)/libcdll.dll $(BUILD_DIR)/cdll.o $(BUILD_DIR)/fdll.o -Wl,--out-implib,$(BUILD_DIR)/libcdll.a,--output-def,$(BUILD_DIR)/libcdll.def -lgfortran
/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio\ 12.0/VC/BIN/lib /MACHINE:x86 /DEF:$(BUILD_DIR)\\libcdll.def /OUT:$(BUILD_DIR)\\libcdll.lib
clean:
rm -f $(BUILD_DIR)/*
CMakeLists. txt
project(cmake_test)
add_executable(cprog cprog.cpp)
find_path(FORTRAN_DIR NAMES cdll.cpp fdll.f90 Makefile PATHS ../source)
execute_process(COMMAND make
WORKING_DIRECTORY ${FORTRAN_DIR})
set(FORTRAN_LIB ${FORTRAN_DIR}/build/libcdll.lib)
include_directories(${FORTRAN_DIR})
set(MY_LIBRARIES ${MY_LIBRARIES} ${FORTRAN_LIB})
target_link_libraries(cprog ${MY_LIBRARIES})
# See: http://stackoverflow.com/questions/10671916/how-to-copy-dll-files-into-the-same-folder-as-the-executable-using-cmake
add_custom_command(TARGET cprog POST_BUILD # Adds a post-build event to cprog
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake -E copy_if_different..."
"${FORTRAN_DIR}/build/libcdll.dll" # <--this is the file to copy
$<TARGET_FILE_DIR:cprog>) # <--this is where to copy it
Es ist nicht ganz klar (vielleicht habe ich die Frage nicht gründlich genug gelesen) - Sie versuchen nicht, eine Windows-Programmdatei mit einer Linux-Bibliothek zu verknüpfen, oder? –
Ich glaube nicht ... Sie werden beide auf Windows gebaut, nur das FORTRAN wird mit gfortran im Makefile erstellt, das von CMake aufgerufen wird. Ich weiß nicht, darüber nachzudenken, genau wie es 'make' nennt. Ich habe MSYS2 installiert, und ich habe es damit arbeiten, bevor ich zu diesem Zeitpunkt, aber ich weiß nicht, was CMake verwendet, um diesen Anruf zu machen. Wie würde ich herausfinden? –
Nun, vielleicht möchten Sie Ihre Frage klären, es scheint, ich bin nicht die einzige Person, die zunächst verwirrt war. Wie für den Rest Ihres Kommentars, wenn Sie Material zu Ihrer Frage hinzufügen hinzufügen, stellen Sie keine zusätzlichen Fragen in Kommentaren, sie sind einfach zu schwer zu lesen. –