库的编译
Vcpkg
vcpkg 可帮助我们在 Windows、 Linux 和 MacOS 上管理 C 和 C++ 库。 这个工具和生态链正在不断发展。
# 安装 vcpkg
git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap-vcpkg.bat
# 安装项目所需要的库
.\vcpkg\vcpkg install [package name]:x64-windows
在 CMake 中使用 vcpkg,需要使用以下工具链文件:
cmake -B [build directory] -S . "-DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake"
cmake --build [build directory]
Boost
Linux GCC编译
sudo apt install libpython3.11-dev
tar -xvf boost_1_87_0.tar.gz
cd boost_1_87_0/
./bootstrap.sh --prefix=/opt/Libraries/boost_1_87_0
./b2 install -q --prefix=/opt/Libraries/boost_1_87_0 threading=multi link=shared runtime-link=shared variant=release cxxstd=17 cxxflags=-fPIC cflags=-fPIC
#PIC可加上 cxxflags=-fPIC cflags=-fPIC
#静态编译 link=static (应用程序动态库开发时,不建议静态构建,因为boost库大多数都是header-only,会导致每个动态库存在一个实例的情况)
ARM-GCC交叉编译
tar -xvf boost_1_88_0.tar.gz
cd boost_1_88_0/
./bootstrap.sh --prefix=/opt/aarch64-v01c01-linux-gnu-gcc/lib/boost_1_88_0
然后会在boost_1_88_0/
目录下生成一个project-config.jam
文件。打开该文件,作如下修改。
# Compiler configuration. This definition will be used unless
# you already have defined some toolsets in your user-config.jam
# file.
if ! gcc in [ feature.values <toolset> ]
{
using gcc : aarch64 : /opt/aarch64-v01c01-linux-gnu-gcc/bin/aarch64-linux-gnu-gcc :
<linkflags>-lstdc++
;
}
然后执行:
./b2 install --prefix=/opt/aarch64-v01c01-linux-gnu-gcc/lib/boost_1_88_0 \
link=shared threading=multi runtime-link=shared variant=release \
cxxstd=17 cxxflags=-fPIC cflags=-fPIC pch=off
有的交叉编译器不支持pch,如果编译失败,可尝试加上 pch=off
。
NDK
编译libffi
下载源码libffi,在MSYS2下编译。
pacman -S diffutils
./configure --prefix=/d/Android/libffi-3.4.4 --host=aarch64-linux-android30 CFLAGS="-march=armv8-a -DANDROID" --enable-static --disable-shared --disable-multi-os-directory --target=aarch64-linux-android30
编译python
(目前编译完成后,编译应用无法正常运行,直接crash。)下载Python源码。
pacman -S pkg-config python3
export NDK_HOME=/d/Android/Sdk/ndk/25.1.8937393
export COMPILER_ROOT=${NDK_HOME}/toolchains/llvm/prebuilt/windows-x86_64
export CC=${COMPILER_ROOT}/bin/aarch64-linux-android30-clang
export LD=${COMPILER_ROOT}/bin/ld.ldd.exe
export AR=${COMPILER_ROOT}/bin/llvm-ar.exe
export READELF=${COMPILER_ROOT}/bin/llvm-readelf.exe
export ac_cv_file__dev_ptmx=no
export ac_cv_file__dev_ptc=no
./configure CFLAGS="-fPIC -I/d/Android/libffi-3.4.4/include" LDFLAGS="-L/d/Android/libffi-3.4.4/lib -lffi" --prefix=/d/Android/python-3.11.4 --enable-shared --host=aarch64-linux-android --target=aarch64-linux-android30 --build=x86_64-linux-gnu --with-build-python --disable-ipv6
在生成的Makefile中,将INSTSONAME= libpython$(LDVERSION).so.1.0
修改为INSTSONAME= libpython$(LDVERSION).so
,NDK中只能识别以.so
为后缀名的动态库。
在boostcpp.jam
找到如下内容,注释掉,使得动态库的扩展名为.so
:
if $(type) = SHARED_LIB &&
! [ $(property-set).get <target-os> ] in windows cygwin darwin aix &&
! [ $(property-set).get <toolset> ] in pgi
{
result = $(result).$(BOOST_VERSION) ;
}
在tools/build/src/tools/python.jam
中,注释掉pthread
库的链接(否则编译Boost.Python时会提示找到不到-lpthread
):
case * : return <library>dl
<toolset>gcc:<library>util <toolset-intel:platform>linux:<library>util ;
编辑 project-config.jam 文件
using clang : : D:/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe :
<compileflags>--target=aarch64-linux-android29
<compileflags>-fPIC
<compileflags>-frtti
<compileflags>-fexceptions
<linkflags>-target
<linkflags>aarch64-linux-android29
<archiver>D:/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe
;
using python
: 3.11
: /d/Android/python-3.11.3
: /d/Android/python-3.11.3/include/python3.11
: /d/Android/python-3.11.3/lib
:
;
然后在命令行(MSYS2)中输入:
./b2.exe install --prefix=/d/Android/boost_1_87_0 toolset=clang cxxstd=11 link=shared threading=multi runtime-link=shared --build-dir=build/ndk target-os=android binary-format=elf address-model=64 architecture=arm abi=aapcs define=BOOST_FILESYSTEM_DISABLE_STATX=1 --without-python -q
Windows MSVC编译
进入如下所示命令行。
执行以下命令:
.\bootstrap.bat
.\b2.exe -q install --prefix=E:\Projects\Libraries\boost_1_88_0_msvc2022_64bit link=shared threading=multi runtime-link=shared variant=debug,release address-model=64 cxxstd=17 define=BOOST_USE_WINAPI_VERSION=BOOST_WINAPI_VERSION_WIN10
boost_1_83_0
是最后一个兼容 Windows7 的版本,如果需要在 Visual Studio 2022 上成功编译,需要修改文件:(搜索 if [ MATCH "(14.3)" : $(version) ]
,然后对比加入下面的内容)
if [ MATCH "(14.4)" : $(version) ]
{
if $(.debug-configuration)
{
ECHO "notice: [generate-setup-cmd] $(version) is 14.4x" ;
}
parent = [ path.native [ path.join $(parent) "..\\..\\..\\..\\..\\Auxiliary\\Build" ] ] ;
}
else if [ MATCH "(14.3)" : $(version) ]
{
if $(.debug-configuration)
{
ECHO "notice: [generate-setup-cmd] $(version) is 14.3" ;
}
parent = [ path.native [ path.join $(parent) "..\\..\\..\\..\\..\\Auxiliary\\Build" ] ] ;
}
OpenSSL
下载源码。
./Configure linux-aarch64 --cross-compile-prefix=aarch64-v01c01-linux-gnu- --prefix=/opt/aarch64-v01c01-linux-gnu-gcc/lib/openssl-3.5.0
./Configure linux-aarch64 --cross-compile-prefix=aarch64-v01c01-linux-gnu- --prefix=/opt/aarch64-v01c01-linux-gnu-gcc/lib/openssl-1.1.1w
./Configure linux-armv4 --cross-compile-prefix=arm-linux-gnueabihf- --prefix=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/lib/openssl-3.3.1 no-tests no-example
make -j28 && make install
FFmpeg
参考这里。
NNG
mkdir build
cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/opt/Libraries/nng-1.6.0_debug ..
ninja
ninja install
libdatachannel
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER aarch64-v01c01-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-v01c01-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
cmake -G Ninja -S . -B build -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \
-DBUILD_SHARED_LIBS=OFF \
-DNO_TESTS=ON \
-DNO_EXAMPLES=ON \
-DOPENSSL_ROOT_DIR=/opt/aarch64-v01c01-linux-gnu-gcc/lib/openssl-3.5.0 \
-DOPENSSL_CRYPTO_LIBRARY=/opt/aarch64-v01c01-linux-gnu-gcc/lib/openssl-3.5.0/lib/libcrypto.so \
-DOPENSSL_SSL_LIBRARY=/opt/aarch64-v01c01-linux-gnu-gcc/lib/openssl-3.5.0/lib/libssl.so \
-DCMAKE_INSTALL_PREFIX=/opt/aarch64-v01c01-linux-gnu-gcc/lib/libdatachannel-0.22.6 \
-DCMAKE_BUILD_TYPE=Release
cmake --build build --target all
cmake --install build
VTK
VTK_GROUP_ENABLE_Qt YES
VTK_MODULE_ENABLE_VTK_GUISupportQt YES
VTK_MODULE_ENABLE_VTK_GUISupportQtQuick YES
VTK_MODULE_ENABLE_VTK_GUISupportQtSQL YES
VTK_MODULE_ENABLE_VTK_RenderingQt YES
VTK_MODULE_ENABLE_VTK_ViewsQt YES
VTK_QT_VERSION 6
VTK_MODULE_ENABLE_VTK_RenderingExternal YES
mongo c
sudo apt install libssl-dev
mongocxx
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(libbson-1.0_DIR /opt/Libraries/mongo-c-driver-1.17.5_release/lib/cmake/libbson-1.0)
set(libmongoc-1.0_DIR /opt/Libraries/mongo-c-driver-1.17.5_release/lib/cmake/libmongoc-1.0)
set(libbson-static-1.0_DIR /opt/Libraries/mongo-c-driver-1.17.5_release/lib/cmake/libbson-static-1.0)
set(libmongoc-static-1.0_DIR /opt/Libraries/mongo-c-driver-1.17.5_release/lib/cmake/libmongoc-static-1.0)
else()
set(libbson-1.0_DIR /opt/Libraries/mongo-c-driver-1.17.5_debug/lib/cmake/libbson-1.0)
set(libmongoc-1.0_DIR /opt/Libraries/mongo-c-driver-1.17.5_debug/lib/cmake/libmongoc-1.0)
set(libbson-static-1.0_DIR /opt/Libraries/mongo-c-driver-1.17.5_debug/lib/cmake/libbson-static-1.0)
set(libmongoc-static-1.0_DIR /opt/Libraries/mongo-c-driver-1.17.5_debug/lib/cmake/libmongoc-static-1.0)
endif()
include_directories(
/opt/Libraries/mongo-c-driver-1.17.5_debug/include/libmongoc-1.0
/opt/Libraries/mongo-c-driver-1.17.5_debug/include/libbson-1.0
)
如果编译不过:
CMAKE_CXX_FLAGS="/Zc:__cplusplus"
PCL
使用vcpkg安装flann:
.\vcpkg\vcpkg.exe install flann:x64-windows
设置CMake变量(Qt Creator在Initial Configuration中添加):
CMAKE_TOOLCHAIN_FILE [path to vcpkg]/scripts/buildsystems/vcpkg.cmake
PCL_BUILD_WITH_BOOST_DYNAMIC_LINKING_WIN32 ON
BUILD_visualization ON
BUILD_tools OFF #如果编译失败的话,或者想减少编译时长
在CMakeLists.txt中添加:
set(Libraries_ROOT E:/Projects/Libraries)
set(BOOST_ROOT ${Libraries_ROOT}/boost_1_82_0_msvc2022_64bit)
set(EIGEN_INCLUDE_DIR ${Libraries_ROOT}/eigen-3.4.0/include/eigen3)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(VTK_DIR ${Libraries_ROOT}/VTK-9.2.6_msvc2022_64bit_release/lib/cmake/vtk-9.2)
else()
set(VTK_DIR ${Libraries_ROOT}/VTK-9.2.6_msvc2022_64bit_debug/lib/cmake/vtk-9.2)
endif()
编译应用程序时,提示如下错误时
KittiVisualizer.cpp.obj:-1: error: LNK2019: 无法解析的外部符号 "void __cdecl vtkRenderingGL2PSOpenGL2_AutoInit_Construct(void)" (?vtkRenderingGL2PSOpenGL2_AutoInit_Construct@@YAXXZ),该符号在函数 "public: __cdecl vtkRenderingOpenGL2_AutoInit::vtkRenderingOpenGL2_AutoInit(void)" (??0vtkRenderingOpenGL2_AutoInit@@QEAA@XZ) 中被引用
KittiVisualizer.cpp.obj:-1: error: LNK2019: 无法解析的外部符号 "void __cdecl vtkRenderingGL2PSOpenGL2_AutoInit_Destruct(void)" (?vtkRenderingGL2PSOpenGL2_AutoInit_Destruct@@YAXXZ),该符号在函数 "public: __cdecl vtkRenderingOpenGL2_AutoInit::~vtkRenderingOpenGL2_AutoInit(void)" (??1vtkRenderingOpenGL2_AutoInit@@QEAA@XZ) 中被引用
将相应库加入其中
target_link_libraries(KittiVisualizer PRIVATE
Qt5::Gui
Qt5::Widgets
${VTK_LIBRARIES}
${PCL_LIBRARIES}
${Boost_LIBRARIES}
${OPENGL_LIBRARIES}
vtkRenderingGL2PSOpenGL2-8.2
)
OpenCV
cmake -S $(pwd) -B $(pwd)/build -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=/opt/aarch64-v01c01-linux-gnu-gcc/lib/opencv-4.11.0 \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_opencv_world=ON \
-DNEON_INTRINSICS=ON \
-DPNG_ARM_NEON=on \
-DBUILD_TESTS=OFF \
-DWITH_QT=OFF \
-DWITH_VTK=OFF \
-DWITH_GTK=OFF
cmake --build build --target all
cmake --install build
libyuv
git clone https://github.com/lemenkov/libyuv.git
cd libyuv
cmake -S $(pwd) -B $(pwd)/build -DCMAKE_TOOLCHAIN_FILE=resources/cmake/toolchain.cmake -DCMAKE_INSTALL_PREFIX=/opt/toolchains/Libraries/libyuv
cmake --build build --target all
cmake --install build
speex
./configure -prefix=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/lib/speexdsp-1.2.1 -enable-static -disable-shared --build=arm-linux-gnueabihf --host=arm-linux CC=arm-linux-gnueabihf-gcc
libjpeg-turbo
cmake -G Ninja -B build -S . -DCMAKE_BUILD_TYPE=Debug -DCMAKE_POSITION_INDEPENDENT_CODE=true -DCMAKE_INSTALL_PREFIX="E:\Projects\Libraries\libjpeg-turbo-3.0.3_msvc2022_64bit_debug"
cmake --build build --target all
cmake --install build
Wt
set(Projects_ROOT E:/Projects)
set(Libraries_ROOT ${Projects_ROOT}/Libraries)
set(BOOST_ROOT ${Libraries_ROOT}/boost_1_80_0_msvc2022_64bit)
set(OPENSSL_ROOT_DIR D:/Qt/Tools/OpenSSL/Win_x64)
set(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
set(OPENSSL_LIBRARIES
${OPENSSL_ROOT_DIR}/lib/libcrypto.lib
${OPENSSL_ROOT_DIR}/lib/libssl.lib
)
OPTION(BOOST_DYNAMIC "Link to boost DLLs (OFF means static link)" ON)
# set(OPENSSL_ROOT_DIR ${SSL_PREFIX})
# find_package(OpenSSL)
# IF(ENABLE_SSL AND OPENSSL_FOUND)
SET(HAVE_SSL ON)
SET(WT_WITH_SSL true)
# ENDIF(ENABLE_SSL AND OPENSSL_FOUND)