C++ mingw + cmake: Linker-Probleme mit asmjit

V

VikingGe

Gast
Hallo,

ich habe da mal ein Problem. Und zwar scheitere ich seit Stunden daran, ein CMake-Projekt, das AsmJit (next-branch) verwendet, mit mingw unter Windows ans Laufen zu kriegen. Scheitern tut es daran, dass zwar alles compiliert, ganz am Ende beim Linken aber ein Haufen undefinierter Symbole gemeckert wird, die mit asmjit zu tun haben:

Code:
CMakeFiles/app.dir/objects.a(app.cpp.obj):app.cpp:(.text+0x24): undefined reference to `__imp__ZN6asmjit10JitRuntimeC1Ev'
CMakeFiles/app.dir/objects.a(app.cpp.obj):app.cpp:(.text+0x37): undefined reference to `__imp__ZN6asmjit10JitRuntimeD1Ev'
CMakeFiles/app.dir/objects.a(app.cpp.obj):app.cpp:(.text+0x6f): undefined reference to `__imp__ZN6asmjit9x86OpDataE'
CMakeFiles/app.dir/objects.a(app.cpp.obj):app.cpp:(.text+0x83): undefined reference to `__imp__ZN6asmjit9x86OpDataE'

Ich verstehe das nicht. Die Dateien werden compiliert, die Library wird gelinkt, und wenn ich das ganze für Linux baue, funktioniert alles problemlos. Ich habe mal ein Test-Projekt angehängt, wo nur AsmJit sowie ein Dreizeiler, der eine Klasse daraus benutzt, drin sind, aber auch da kommen die Fehler.

Meine CMakeLists.txt:
Code:
cmake_minimum_required(VERSION 3.2)
project(mingw-cmake)

add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/asmjit")

add_executable(app "${CMAKE_CURRENT_SOURCE_DIR}/app.cpp")
target_link_libraries(app asmjit)

Vereinfachte CMakeLists.txt für asmjit (auch mit dem Original geht es nicht):
Code:
cmake_minimum_required(VERSION 3.2)

set(asmjit_libs  "")
set(asmjit_flags "-O2 -w -DASMJIT_BUILD_X86")

if ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
  set(asmjit_libs ${asmjit_libs} "rt")
endif()

# =============================================================================
# [AsmJit - Source]
# =============================================================================

set(asmjit_src_dir  "${CMAKE_CURRENT_SOURCE_DIR}/src/")
set(asmjit_base_dir "${asmjit_src_dir}/asmjit/base")
set(asmjit_x86_dir  "${asmjit_src_dir}/asmjit/x86")

set(asmjit_source_files
  "${asmjit_base_dir}/arch.cpp"
  "${asmjit_base_dir}/assembler.cpp"
  "${asmjit_base_dir}/codebuilder.cpp"
  "${asmjit_base_dir}/codecompiler.cpp"
  "${asmjit_base_dir}/codeemitter.cpp"
  "${asmjit_base_dir}/codeholder.cpp"
  "${asmjit_base_dir}/constpool.cpp"
  "${asmjit_base_dir}/cpuinfo.cpp"
  "${asmjit_base_dir}/func.cpp"
  "${asmjit_base_dir}/globals.cpp"
  "${asmjit_base_dir}/logging.cpp"
  "${asmjit_base_dir}/operand.cpp"
  "${asmjit_base_dir}/osutils.cpp"
  "${asmjit_base_dir}/regalloc.cpp"
  "${asmjit_base_dir}/runtime.cpp"
  "${asmjit_base_dir}/string.cpp"
  "${asmjit_base_dir}/utils.cpp"
  "${asmjit_base_dir}/vmem.cpp"
  "${asmjit_base_dir}/zone.cpp"
  "${asmjit_base_dir}/zonecontainers.cpp"
  "${asmjit_base_dir}/zoneheap.cpp")

set(asmjit_x86_source_files
  "${asmjit_x86_dir}/x86assembler.cpp"
  "${asmjit_x86_dir}/x86regalloc.cpp"
  "${asmjit_x86_dir}/x86internal.cpp"
  "${asmjit_x86_dir}/x86inst.cpp"
  "${asmjit_x86_dir}/x86logging.cpp"
  "${asmjit_x86_dir}/x86compiler.cpp"
  "${asmjit_x86_dir}/x86operand_regs.cpp"
  "${asmjit_x86_dir}/x86operand.cpp"
  "${asmjit_x86_dir}/x86ssetoavxpass.cpp"
  "${asmjit_x86_dir}/x86builder.cpp")

set(asmjit_source_files
  ${asmjit_x86_source_files}
  ${asmjit_source_files})
  
# =============================================================================
# [AsmJit - Targets]
# =============================================================================
set(CMAKE_CXX_FLAGS ${asmjit_flags})

add_library(asmjit ${asmjit_source_files})
target_link_libraries(asmjit ${asmjit_libs})

Unter Linux hab ich das gebaut mit
Code:
mkdir build; cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-mingw64-linux.cmake
make -j6
(in der toolchain-Datei ggf. Pfade anpassen)

Nativ unter Windows bauen habe ich es auch schon probiert, bekomme da aber dieselben Fehler.

Übrigens habe ich keine Probleme, wenn ich selber eine kleine Library zusammenhacke, wo eine Klasse drin ist, die ich dann im Hauptprogramm benutze. Das verwundert mich umso mehr, denn eigentlich sollte das doch weitgehend identisch funktionieren. Ich verstehe einfach nicht, wo hier das Problem liegt.

Wäre nett, wenn sich das mal jemand ansehen könnte.
 

Anhänge

  • project.zip
    472 KB · Aufrufe: 161
Sieht wie ein Problem mit Name-Mangling aus. Hast du für beide Projekte denselben Compiler (und dieselbe Version und dieselben Optionen) benutzt?
 
Zuletzt bearbeitet:
Ich compiliere alles in einem Durchgang (natürlich mit demselben Compiler) durch. Mit denselben Optionen für beide funktioniert es auch nicht, sollte aber eigentlich auch am Mangling nichts ändern.

Übrigens sind alle Symbole nach dem in der entstehenden Library vorhanden, alledings ohne den "__imp_"-Prefix. Dazu gibt es auch einiges auf Google, aber was ich da finde, bezieht sich ausschließlich auf den Fall, dass mingw eine Systembibliothek nicht findet - hilft mir irgendwie nicht weiter, zumal es wie gesagt mit eigenem Code auch zu funktionieren scheint.

Noch was: Es funktioniert, wenn ich
Code:
x86_64-w64-mingw32-g++ -shared asmjit/src/asmjit/base/*.cpp asmjit/src/asmjit/x86/*.cpp -o asmjit.a
x86_64-w64-mingw32-g++ app.cpp asmjit.a -o app.exe
von Hand ausführe. Anscheinend haut cmake da irgendwas durcheinander.

Hier im Anhang mal die Ausgabe von make VERBOSE=1. Sind da irgendwelche Auffälligkeiten, die ich nicht sehe?



Nachtrag: Hat sich erledigt. AsmJit ist an sich zwar wirklich eine tolle Sache, aber nicht lebensnotwendig, also wird es aus meinem Projekt verbannt. Ohne den Kram funktioniert alles wunderbar und ich habe auch keine Lust, mich durch über 1000 Zeilen C-Macros zu wühlen, um den Fehler zu finden.
 

Anhänge

  • output.txt
    14,9 KB · Aufrufe: 200
Zuletzt bearbeitet:
Zurück
Oben