0
点赞
收藏
分享

微信扫一扫

跨平台编译


1、使用CMake进行跨平台

​​cmake(6):适配多种操作系统编译构建以及if命令_翔底的博客

​​如何写出优雅的跨平台的C/C++代码_芥末的无奈的博客

2、标志位

// a.cpp
#include "a.h"

#ifdef _WIN32_
void print_something()
{
printf("_WIN32_");
}
#ifdef _LINUX_
void print_something()
{
printf("_LINUX_");
}
#ifdef _IOS_
void print_something()
{
printf("_IOS_");
}
#ifdef _ANDROID_
void print_something()
{
printf("_ANDROID_");
}
#endif

检测架构

/* Identify known platforms by name.  */
#if defined(__linux) || defined(__linux__) || defined(linux)
# define PLATFORM_ID "Linux"

#elif defined(__CYGWIN__)
# define PLATFORM_ID "Cygwin"

#elif defined(__MINGW32__)
# define PLATFORM_ID "MinGW"

#elif defined(__APPLE__)
# define PLATFORM_ID "Darwin"

#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
# define PLATFORM_ID "Windows"

检测平台

#if defined(_WIN32) && defined(_MSC_VER)
# if defined(_M_IA64)
# define ARCHITECTURE_ID "IA64"

# elif defined(_M_X64) || defined(_M_AMD64)
# define ARCHITECTURE_ID "x64"

# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"

# elif defined(_M_ARM)
# if _M_ARM == 4
# define ARCHITECTURE_ID "ARMV4I"
# elif _M_ARM == 5
# define ARCHITECTURE_ID "ARMV5I"
# else

​​跨平台:GN实践详解(ninja, 编译, windows/mac/android实战)​​

linux 静态库跨平台编译

​​GCC编译静态库的-fPIC选项_太上绝情的博客

​​cmake时添加-fPIC编译选项_阿飞0308的博客

# 1
add_compile_options(-fPIC)

#2
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")

#3
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

​​CMake 在Linux上使用动态库和静态库_hp_cpp的博客-

target_link_libraries(myProject libhello.so)  #这些库名写法都可以。
target_link_libraries(myProject hello)
target_link_libraries(myProject -lhello)

​​https://www.jianshu.com/p/37fbe3dd202b​​

# 以导入外部库的方式(不会重新编译)重新构建一个静态库libMath
add_library(libMath STATIC IMPORTED)
# 设置要导入的外部静态库的路径
set_target_properties(libMath PROPERTIES IMPORTED_LOCATION ${ROOT_DIR}/3rdlib/libmath.a)

Android cmake

​​CMake  |  Android NDK  |  Android Developers​​

​​GitHub - android/ndk-samples: Android NDK samples with Android Studio​​

​​C++ 库支持  |  Android NDK  |  Android Developers​​

​​向您的项目添加 C 和 C++ 代码  |  Android 开发者  |  Android Developers​​

​​ExternalNativeBuildOptions  |  Android Developers​​

​​关于abiFilters的使用_只是备忘的博客

​​Android NDK学习(六): so文件兼容之abiFilters的使用 - JavaShuo​​

​​AndroidStudio创建jniLibs文件夹添加jar包\so库_Rooney8的博客

​​Android Studio gardle 配置 ndk 指定 ABI: abiFilters 详解_阿飞

android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
ndkVersion '22.1.7171670'

defaultConfig {
applicationId "com.lj.ainative"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
ndk {
abiFilters "arm64-v8a"
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version '3.18.1'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}

示例:

#include <string.h>
#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
#define ABI "x86_64"
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");
}

cmake_minimum_required(VERSION 3.4.1)
project(hello-jni C CXX)

add_library(hello-jni SHARED
hello-jni.c)

# Include libraries needed for hello-jni lib
target_link_libraries(hello-jni
android
log)

编译:linux下

#!/bin/bash
export NDK=/home/xx/android/ndk

cmake ../../../ \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_STL=c++_static \
-DANDROID_NATIVE_API_LEVEL=android-21 \
-DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=.

make -j4

编译:windows下

@echo off
set ANDROID_NDK=D:/Android/Sdk/ndk/21.3.6528147

cmake .. ^
-G "Unix Makefiles" ^
-DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK%/build/cmake/android.toolchain.cmake ^
-DCMAKE_MAKE_PROGRAM=%ANDROID_NDK%/prebuilt/windows-x86_64/bin/make.exe ^
-DCMAKE_BUILD_TYPE=Release ^
-DANDROID_ABI="arm64-v8a" ^
-DANDROID_STL=c++_static ^
-DANDROID_NATIVE_API_LEVEL=android-21 ^
-DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=.

echo:
echo begin to build============================================
echo.

cmake --build . -- -j5
REM %ANDROID_NDK%/prebuilt/windows-x86_64/bin/make -j4

pause

​​CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool._码农客栈的博客

​​Windows下使用CLion进行NDK编程(CMake) - 灰信网(软件开发博客聚合)​​

​​cmake(1) — CMake 3.24.2 Documentation​​

​​Android NDK开发扫盲及最新CMake的编译使用 - 知乎​​  借助Android Gradle

​​浏览器上的IDE:code-server安装——服务器版的vscode - 知乎​​

​​GNU与c++STL的区别与联系_龙行天下01的博客

Qt CMake

修改 CMakeLists.txt,添加搜索路径:

# 添加 begin
set(CMAKE_PREFIX_PATH "D:/Qt6/6.2.2/msvc2019_64")
list(APPEND CMAKE_PREFIX_PATH /home/Qt/5.15.2/gcc_64)

message("CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")

# 添加 end

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

​​Failed to find "GL/gl.h" in "/usr/include/libdrm"_aiyun5666的博

优化探索

​​clang&llvm简介_大1234草的博客

举报

相关推荐

0 条评论