我正在使用arm-linux-androideabi-g++
编译器.当我尝试编译一个简单的"你好,世界!" 程序编译好.当我通过在该代码中添加一个简单的异常处理来测试它时它也可以工作(添加之后-fexceptions
..我猜它默认是禁用的).
这适用于Android设备,我只想使用CMake,而不是ndk-build
.
例如 - first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
它没有问题......
问题 ...我试图用CMake文件编译文件.
我想添加-fexceptions
标志.我试过了
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
Run Code Online (Sandbox Code Playgroud)
和
set ( CMAKE_C_FLAGS "fexceptions")
Run Code Online (Sandbox Code Playgroud)
它仍然显示错误.
Off*_*rmo 227
假设您要添加这些标志(最好将它们声明为常量):
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov")
Run Code Online (Sandbox Code Playgroud)
有几种方法可以添加它们:
最简单的(不干净,但简单方便,只适用于编译标志,C&C++一次):
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
Run Code Online (Sandbox Code Playgroud)附加到相应的CMake变量:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
Run Code Online (Sandbox Code Playgroud)使用目标属性,参见 doc CMake编译标志目标属性,需要知道目标名称.
get_target_property(TEMP ${THE_TARGET} COMPILE_FLAGS)
if(TEMP STREQUAL "TEMP-NOTFOUND")
SET(TEMP "") # Set to empty string
else()
SET(TEMP "${TEMP} ") # A space to cleanly separate from existing content
endif()
# Append our values
SET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" )
set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )
Run Code Online (Sandbox Code Playgroud)现在我使用方法2.
vit*_*aut 146
在较新版本的CMake中,您可以分别使用target_compile_options
和设置单个目标的编译器和链接器标志target_link_libraries
(是的,后者也设置链接器选项):
target_compile_options(first-test PRIVATE -fexceptions)
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是你可以控制选项传播到依赖于这个PUBLIC
和/的其他目标PRIVATE
.
从CMake 3.13开始,您还可以使用target_link_options
添加链接器选项,使意图更清晰.
sak*_*kra 40
尝试设置变量CMAKE_CXX_FLAGS
而不是CMAKE_C_FLAGS
:
set (CMAKE_CXX_FLAGS "-fexceptions")
Run Code Online (Sandbox Code Playgroud)
该变量CMAKE_C_FLAGS
仅影响C编译器,但您正在编译C++代码.
添加标志CMAKE_EXE_LINKER_FLAGS
是多余的.
指定特定于工具链的选项的首选方法是使用 CMake 的工具链工具。这确保了以下各项之间的清晰划分:
理想情况下,您的CMakeLists.txt文件中不应该有编译器/链接器标志——即使在if
/endif
块中。并且您的程序应该使用默认工具链(例如 GNU/Linux 上的 GCC 或 Windows 上的 MSVC)为本地平台构建,没有任何额外的标志。
添加工具链的步骤:
使用全局工具链设置创建一个文件,例如arm-linux-androideadi-gcc.cmake:
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_CXX_FLAGS_INIT "-fexceptions")
Run Code Online (Sandbox Code Playgroud)
(您可以在此处找到一个示例 Linux 交叉编译工具链文件。)
当您想使用此工具链生成构建系统时,请CMAKE_TOOLCHAIN_FILE
在命令行中指定参数:
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_CXX_FLAGS_INIT "-fexceptions")
Run Code Online (Sandbox Code Playgroud)
(注意:您不能使用相对路径。)
正常构建:
mkdir android-arm-build && cd android-arm-build
cmake -DCMAKE_TOOLCHAIN_FILE=$(pwd)/../arm-linux-androideadi-gcc.cmake ..
Run Code Online (Sandbox Code Playgroud)
工具链文件使交叉编译更容易,但它们还有其他用途:
为您的单元测试强化诊断。
set(CMAKE_CXX_FLAGS_INIT "-Werror -Wall -Wextra -Wpedantic")
Run Code Online (Sandbox Code Playgroud)
难以配置的开发工具。
# toolchain file for use with gcov
set(CMAKE_CXX_FLAGS_INIT "--coverage -fno-exceptions -g")
Run Code Online (Sandbox Code Playgroud)
加强安全检查。
# toolchain file for use with gdb
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-fsanitize=address,undefined -fsanitize-undefined-trap-on-error")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fsanitize=address,undefined -static-libasan")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
441097 次 |
最近记录: |