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:
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:
Vereinfachte CMakeLists.txt für asmjit (auch mit dem Original geht es nicht):
Unter Linux hab ich das gebaut mit
(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.
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
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.