我正在使用Grassroot Dicom Viewer 2.8.9版在Windows 10 64位平台上编译成Emscripten库bc。
我遵循了website
的指示/usr/bin/c++ -I/home/arunabh-compute/sensor-drivers -isystem
/usr/local/include -isystem /usr/local/GenICam/include -Wall -O3 -
std=gnu++14 -o CMakeFiles/save_cpp.dir/stdafx.cpp.o -c /home/arunabh-
compute/sensor-drivers/stdafx.cpp
CMakeFiles/save_cpp.dir/build.make:178: update target 'save_cpp' due
to: CMakeFiles/save_cpp.dir/link.txt
CMakeFiles/save_cpp.dir/Cpp_Save.cpp.o
CMakeFiles/save_cpp.dir/stdafx.cpp.o
CMakeFiles/save_cpp.dir/build.make /usr/local/ffmpeg/libavcodec.so
/usr/local/ffmpeg/libavcodec.so.58
/usr/local/ffmpeg/libavcodec.so.58.18.100
/usr/local/ffmpeg/libavdevice.so /usr/local/ffmpeg/libavdevice.so.58
/usr/local/ffmpeg/libavdevice.so.58.3.100
/usr/local/ffmpeg/libavfilter.so /usr/local/ffmpeg/libavfilter.so.7
/usr/local/ffmpeg/libavfilter.so.7.16.100
/usr/local/ffmpeg/libavformat.so /usr/local/ffmpeg/libavformat.so.58
/usr/local/ffmpeg/libavformat.so.58.12.100
/usr/local/ffmpeg/libavutil.so /usr/local/ffmpeg/libavutil.so.56
/usr/local/ffmpeg/libavutil.so.56.14.100
/usr/local/ffmpeg/libswresample.so
/usr/local/ffmpeg/libswresample.so.3
/usr/local/ffmpeg/libswresample.so.3.1.100
/usr/local/ffmpeg/libswscale.so /usr/local/ffmpeg/libswscale.so.5
/usr/local/ffmpeg/libswscale.so.5.1.100
之后,我得到了以.a而不是类似于
的.bc结尾的库文件。libgdcmcharls.a libgdcmCommon.a libgdcmDICT.a ....
当我查看每个静态库文件的汇编代码时,
!拱门。/
代替
BC
如教程website中所述
某些构建系统可能无法使用上述方法正确发出位码 程序,您可能会看到无效的位码警告。你可以跑 文件以检查文件是否包含位码(也可以手动检查 如果内容以BC开头)。值得运行emmake make VERBOSE = 1,它将打印出它运行的命令-您应该看到 使用的是emcc,而不是本机系统编译器。如果不是emcc 使用时,可能需要修改configure或cmake脚本。
我认为这是一个问题,我无法生成内容以BC开头的库,但是我得到了!拱./?
当然不能从emcc链接这些文件(找不到引用错误)
emconfigure cmake .
emmake make VERBOSE=1
所以我根据this
修改了GDCM CMakefile.txt。error: undefined symbol: _ZN4gdcm11ImageReader8GetImageEv
error: undefined symbol: _ZN4gdcm11ImageReaderC1Ev
error: undefined symbol: _ZN4gdcm11ImageReaderD1Ev
error: undefined symbol: _ZN4gdcm5Trace14GetErrorStreamE
但是,它没有任何帮助。 “ make”仍然会生成.a库文件
我编译代码的命令如下:我还将所有.a文件复制到与main.cpp相同的文件夹中
if (EMSCRIPTEN)
set(CMAKE_AR "emcc" CACHE)
set(CMAKE_STATIC_LIBRARY_SUFFIX ".bc")
set(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> -o <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_AR> -o <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
link是我的GDCM 2.8.9库文件。在Windows10中使用编译 emcmake cmake,最后是emmake make(基于mingw32-make)。
这是调用emconfigure cmake之后的CMakeCXXCompiler.cmake。
emcc -std=c++17 -O3 -s WASM=1 -s USE_WEBGL2=1 -s FULL_ES3=1 -s ALLOW_MEMORY_GROWTH=1 -o hello.html -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'cwrap']" --no-heap-copy libgdcmcharls.a libgdcmCommon.a libgdcmDICT.a libgdcmDSED.a libgdcmexpat.a libgdcmIOD.a libgdcmjpeg12.a libgdcmjpeg16.a libgdcmjpeg8.a libgdcmMEXD.a libgdcmMSFF.a libgdcmopenjp2.a libgdcmzlib.a libgdcmuuid.a libsocketxx.a main.cpp ...........
答案 0 :(得分:1)
最后我找到了问题。从命令生成的库;
配置cmake。
即使我看到编译器使用em ++。bat作为编译器,也不兼容emcc。
如何发现问题。
我使用一个名为“ Hex Editor Neo”的程序来打开库文件(仅使用小型库文件进行测试,大型库文件会导致程序崩溃)。
如果与emcc不兼容。前几个字符将是!拱这将不起作用。请参见下面的图片,了解从cmake生成的错误的库文件;
请确保您的BC如下图所示;
但是怎么做
您不能只使用
emconfigure cmake . <---------- wrong
您需要放置一个选项,以按照以下命令生成位码(.bc)
emconfigure cmake . -DEMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES=1
然后它将生成所有以.bc结尾的库文件,并且这些库文件可以与emcc链接