我必须如何处理交叉编译C++库
What must I do with C++ libraries on cross compilation?
这是我配置的编译器部分:
IF(UNIX)
## Compiler flags
# specify the cross compiler
SET(CMAKE_C_COMPILER /home/username/projects/buildroot/output/host/usr/bin/arm-linux-gcc)
SET(CMAKE_CXX_COMPILER /home/username/projects/buildroot/output/host/usr/bin/arm-linux-g++)
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "-O3")
set(CMAKE_EXE_LINKER_FLAGS "-lsqlite3 -lrt -lpthread")
endif()
target_link_libraries(complex
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY})
ENDIF(UNIX)
有 3 个问题: -lsqlite3 -lrt -lpthread
我必须如何为我的架构制作它们并在此处指定?在我将以某种方式为我的架构重新编译库之后,如何设置(使用 set?)编译库的路径?
如果你想用CMake进行交叉编译,你真的应该使用一个工具链文件。有关介绍,请参阅 CMake Wiki。为了使用第三方库(即未包含在交叉编译工具链中),您还需要交叉编译它们。
编辑:由于您使用的是构建根工具链,因此可以使用已包含的CMake工具链文件。只需在调用 CMake 时传递-DCMAKE_TOOLCHAIN_FILE=/home/username/projects/buildroot/output/toolchainfile.cmake
即可。无需在CMakeLists.txt
文件中设置CMAKE_C_COMPILER
和CMAKE_CXX_COMPILER
。此外,设置CMAKE_CXX_FLAGS
和CMAKE_EXE_LINKER_FLAGS
被认为是非常糟糕的做法。
大概你在构建buildroot工具链时已经构建了sqlite3,所以你可以像使用任何其他库一样使用它。即:
find_path(SQLITE3_INCLUDE_DIR sqlite3.h)
find_library(SQLITE3_LIBRARY sqlite3)
if(NOT SQLITE3_INCLUDE_DIR)
message(SEND_ERROR "Failed to find sqlite3.h")
endif()
if(NOT SQLITE3_LIBRARY)
message(SEND_ERROR "Failed to find the sqlite3 library")
endif()
find_package(Threads REQUIRED)
# ...
target_link_libraries(complex
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${SQLITE3_LIBRARY}
${CMAKE_THREAD_LIBS_INIT}
rt)
最后,不要将CMAKE_CXX_FLAGS
设置为 -O3
.用户在配置项目时应传递-DCMAKE_BUILD_TYPE=Release
。
您还必须交叉编译依赖项。路径取决于您的安装位置。
顺便说一句,使用-lpthread
不是获取 POSIX 线程的安全方法。应将选项-pthread
提供给编译器和链接器。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 用于交叉编译和CMake的预处理器宏的单元测试
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 无法使用 aarch64-unknown-nto-qnx7.0.0-g++-5.4.0 编译器交叉编译 QNX 平台的
- 如何使用导出的函数交叉编译 DLL
- 交叉编译:特殊的交叉编译器还是只是带有选项 -march 的 gcc?
- 交叉编译时包括外部库
- 如何交叉编译C++文件
- SFML 交叉编译 for Windows on Linux.
- 使用 cmake 交叉编译 libwebsockets
- 使用cmake交叉编译gRPC
- 为什么Qt必须从源代码构建以进行交叉编译?
- 交叉编译树莓派
- Microsoft Visual Studio 2019交叉编译CMake库 - 有效,但存在SEG错误
- Jlibfprint 交叉编译
- 在Linux上交叉编译Windows应用程序时如何链接到Winsock?
- GPS 的交叉编译显示"unrecognized option"
- C++交叉编译不处理换行输入文本文件
- 从 Linux 到 Windows 交叉编译时,我应该如何处理字符编码
- 我必须如何处理交叉编译C++库