我从头开始,并遵循以下主要步骤:
1.构建并安装交叉编译器工具链(主机Linux,目标Win64):
获取此MXE 版本,仅更改plugins/gcc6/gcc6-overlay.mk
:
$(PKG)_VERSION := 6.3.0
$(PKG)_CHECKSUM := f06ae7f3f790fbf0f018f6d40e844451e6bc3b7bc96e128e63b09825c1f8b29f
然后很简单(只需要一些时间,make --jobs=X JOBS=Y
用来加速):
setenv MXE_SRC /path/to/where/you/extracted/mxe
cd $MXE_SRC
make MXE_TARGETS='x86_64-w64-mingw32.shared x86_64-w64-mingw32.static' MXE_PLUGIN_DIRS=plugins/gcc6 pthreads
setenv PATH $MXE_SRC/usr/bin:$PATH
2. 交叉编译和安装SystemC 2.3.3 库
这同样简单(但要快得多!):
setenv SYSTEMC_SRC /path/to/where/you/extracted/systemc/
setenv SYSTEMC_STATICTOOLCHAIN_DEST /this/is/your/choice
cd $SYSTEMC_SRC
./configure --prefix=$SYSTEMC_STATICTOOLCHAIN_DEST --host=x86_64-w64-mingw32.static
make install
3. 构建一个简单的可执行文件
写几行代码sc_main.cpp
:
#include "systemc.h"
int sc_main (int argc, char* argv[])
{
sc_clock clk("CLOCK", 1, SC_NS, 0.5);
sc_start();
return 0;
}
现在通过最后一步进行构建:
x86_64-w64-mingw32.static-g++ sc_main.cpp -I$SYSTEMC_STATICTOOLCHAIN_DEST/include -L$SYSTEMC_STATICTOOLCHAIN_DEST/lib-mingw64 -lsystemc
我得到一大堆
libsystemc.a(sc_prim_channel.o):sc_prim_channel.cpp:(.text+0x44): undefined reference to `__imp_pthread_mutex_unlock'
(以及相同的变体)。
谁能重现并解释发生了什么?
当 SystemCconfigure
完成时,它清楚地表明它不会使用 Posix 线程,而是使用 WinFiber,所以看到这些未解决的对 phread 的依赖关系我有点惊讶(为了记录,-lpthread
在命令行末尾添加仍然会产生结果相同)
4. 以不同方式构建 SystemC 库的奖励实验
如果我使用本机 Win64 工具链构建 SystemC 库,然后使用相同的命令行构建我的可执行文件:
setenv SYSTEMC_NATIVETOOLCHAIN_DEST /path/to/systemc/libraries/built/with/native/toolchain
x86_64-w64-mingw32.static-g++ sc_main.cpp -I$SYSTEMC_NATIVETOOLCHAIN_DEST/include -L$SYSTEMC_NATIVETOOLCHAIN_DEST/lib-mingw64 -lsystemc
然后一切正常,正如预期的那样。
cmake
此外,如果我使用而不是交叉编译和安装 SystemC 库configure
:
cd $SYSTEMC_SRC
mkdir build && cd build && x86_64-w64-mingw32.static-cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_CXX_STANDARD=14 -DINSTALL_TO_LIB_TARGET_ARCH_DIR=ON -DCMAKE_INSTALL_PREFIX=$SYSTEMC_STATICTOOLCHAIN_DEST
make install
x86_64-w64-mingw32.static-g++ sc_main.cpp -I$SYSTEMC_STATICTOOLCHAIN_DEST/include -L$SYSTEMC_STATICTOOLCHAIN_DEST/lib-mingw64 -lsystemc
然后,正如预期的那样,一切都运行良好。
我怀疑交叉编译时没有正确生成 SystemC 库。任何人都可以确认/否认吗?