CMake的Emscripten库make无法链接

时间:2019-03-20 01:50:50

标签: c++ makefile cmake emscripten gdcm

我正在使用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 ...........

1 个答案:

答案 0 :(得分:1)

最后我找到了问题。从命令生成的库;

配置cmake。

即使我看到编译器使用em ++。bat作为编译器,也不兼容emcc。

如何发现问题。

我使用一个名为“ Hex Editor Neo”的程序来打开库文件(仅使用小型库文件进行测试,大型库文件会导致程序崩溃)。

如果与emcc不兼容。前几个字符将是!拱这将不起作用。请参见下面的图片,了解从cmake生成的错误的库文件;

enter image description here

请确保您的BC如下图所示;

enter image description here

但是怎么做

您不能只使用

emconfigure cmake .  <---------- wrong

您需要放置一个选项,以按照以下命令生成位码(.bc)

emconfigure cmake . -DEMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES=1

然后它将生成所有以.bc结尾的库文件,并且这些库文件可以与emcc链接